Как смешать повторяющиеся и одиночные аргументы с одинаковыми именами - PullRequest
0 голосов
/ 01 марта 2020

Ниже приведен код Go, который использует docopt для анализа аргументов командной строки. В моем примере программы есть две команды: показать и удалить. Шоу принимает один аргумент. Delete принимает несколько аргументов.

Вот проблема: id является повторяющимся аргументом в команде delete . В результате args["<id>"] представляет собой фрагмент строки. Но это также фрагмент строки, если я запускаю myapp с командой show , которая ожидает только один аргумент. Есть ли способ сделать args["<id>"] строкой (вместо среза строки) при вызове команды show ?

Конечно, я мог бы переименовать id в идентификаторы для повторяющегося аргумента, но я думаю, что повторяющиеся имена аргументов не должны быть во множественном числе. Прямо сейчас я просто использую первый элемент в срезе строки при обработке команды show , но для меня это выглядит как обходной путь. Есть ли более идиоматическое c решение?

package main

import (
        "fmt"
        "github.com/docopt/docopt-go"
)

func main() {
        usage := `Usage:
    myapp show <id>
    myapp delete <id>...`

        args, _ := docopt.ParseDoc(usage)
        fmt.Println(args)
}
$ ./myapp delete a b c
map[<id>:[a b c] delete:true show:false]

$ ./myapp show a
map[<id>:[a] delete:false show:true]
...