clop (Command Line Option Parse) — это основанный на struct командный анализатор, который мал, но полон функций.
env DEBUG=xx ./proc
.a.txt, b.txt
в список и добавить их в указанную структуру.proc -d
или proc --debug
.ls -ltr
могут быть записаны как ls -l -t -r
. Это упрощает реализацию стандартных команд POSIX.git add
. Регистрация подкоманд проста: достаточно создать структуру, и вы сможете использовать clop для реализации неограниченного количества подкоманд.if x!= ""
или if y!=0
.go get github.com/guonaihong/clop
package main
import (
"fmt"
"github.com/guonaihong/clop"
)
type Hello struct {
File string `clop:"-f; --file" usage:"file"`
}
func main() {
h := Hello{}
clop.SetVersion("v0.2.0")
clop.SetAbout("Это простой пример demo")
clop.Bind(&h)
fmt.Printf("%#v\n", h)
}
// ./one -f test
// main.Hello{File:"test"}
// ./one --file test
// main.Hello{File:"test"}
``` ```
clop:"subcommand=mv" usage:"Move or rename a file, a directory, or a symlink"
}
func main() {
g := git{}
clop.Bind(&g)
fmt.Printf("git:%#v\n", g)
fmt.Printf("git:set mv(%t) or set add(%t)\n", clop.IsSetSubcommand("mv"), clop.IsSetSubcommand("add"))
switch {
case clop.IsSetSubcommand("mv"):
fmt.Printf("subcommand mv\n")
case clop.IsSetSubcommand("add"):
fmt.Printf("subcommand add\n")
}
}
package main
import (
"fmt"
"github.com/guonaihong/clop"
)
type add struct {
All bool `clop:"-A; --all" usage:"add changes from all tracked and untracked files"`
Force bool `clop:"-f; --force" usage:"allow adding otherwise ignored files"`
Pathspec []string `clop:"args=pathspec"`
}
func (a *add) SubMain() {
// 当add子命令被设置时
// clop会自动调用这个函数
}
type mv struct {
Force bool `clop:"-f; --force" usage:"allow adding otherwise ignored files"`
}
func (m *mv) SubMain() {
// 当mv 子命令被设置时
// clop会自动调用这个 функцию
}
type git struct {
Add add `clop:"subcommand=add" usage:"Add file contents to the index"`
Mv mv `clop:"subcommand=mv" usage:"Move or rename a file, a directory, or a symlink"`
}
func main() {
g := git{}
clop.Bind(&g)
}
Это перевод исходного текста на русский язык.
Sub command implementation method 2
Использование clop для реализации подкоманды — это второй способ. Подкоманда должна реализовать метод SubMain, который будет автоматически вызываться библиотекой clop. Это позволяет избежать написания большого количества if else в main, особенно когда есть много подкоманд. Рекомендуется использовать этот метод.
package main
import (
"fmt"
"github.com/guonaihong/clop"
)
type add struct {
All bool `clop:"-A; --all" usage:"add changes from all tracked and untracked files"`
Force bool `clop:"-f; --force" usage:"allow adding otherwise ignored files"`
Pathspec []string `clop:"args=pathspec"`
}
func (a *add) SubMain() {
// Когда подкоманда add установлена,
// clop автоматически вызовет эту функцию.
}
type mv struct {
Force bool `clop:"-f; --force" usage:"allow adding otherwise ignored files"`
}
func (m *mv) SubMain() {
// Когда подкоманда mv установлена,
// clop автоматически вызовет эту функцию.
}
type git struct {
Add add `clop:"subcommand=add" usage:"Add file contents to the index"`
Mv mv `clop:"subcommand=mv" usage:"Move or rename a file, a directory, or a symlink"`
}
func main() {
g := git{}
clop.Bind(&g)
}
Get command priority
package main
import (
"fmt"
"github.com/guonaihong/clop"
)
type cat struct {
NumberNonblank bool `clop:"-b;--number-nonblank"
usage:"number nonempty output lines, overrides"`
ShowEnds bool `clop:"-E;--show-ends"
usage:"display $ at end of each line"`
}
func main() {
c := cat{}
clop.Bind(&c)
if clop.GetIndex("number-nonblank") < clop.GetIndex("show-ends") {
fmt.Printf("cat -b -E\n")
} else {
fmt.Printf("cat -E -b \n")
}
}
// cat -be
// Вывод cat -b -E
// cat -Eb
// Вывод cat -E -b
Can only be set once
Указанный параметр можно установить только один раз. Если он указан дважды в командной строке, будет выдана ошибка.
package main
import (
"github.com/guonaihong/clop"
)
type Once struct {
Debug bool `clop:"-d; --debug; once" usage:"debug mode"`
}
func main() {
o := Once{}
clop.Bind(&o)
}
/*
./once -debug -debug
error: The argument '-d' was provided more than once, but cannot be used multiple times
For more information try --help
*/
Quick write
Быстрое написание кода с использованием фиксированных коротких и длинных тегов для создания коротких и длинных параметров. Можно сравнить с примером cat. Чем больше параметров в командной строке, тем больше времени можно сэкономить и повысить эффективность.
package main
import (
"fmt"
"github.com/guonaihong/clop"
)
type cat struct {
NumberNonblank bool `clop:"-c;long"
usage:"number nonempty output lines, overrides"`
ShowEnds bool `clop:"-E;long"
usage:"display $ at end of each line"`
Number bool `clop:"-n;long"
usage:"number all output lines"`
SqueezeBlank bool `clop:"-s;long"
usage:"suppress repeated empty output lines"`
ShowTab bool `clop:"-T;long"
usage:"display TAB characters as ^I"`
ShowNonprinting bool `clop:"-v;long"
usage:"use ^ and M- notation, except for LFD and TAB" `
Files []string `clop:"args=files"`
}
func main() {
c := cat{}
err := clop.Bind(&c)
fmt.Printf("%#v, %s\n", c, err)
}
Multi structure series
Многоструктурное объединение функций. Несколько структур объединяются в одно командное представление. Если нужно проанализировать командную строку в нескольких (>=2) структурах, можно использовать функцию объединения структур. Первые несколько структур используют интерфейс clop.Register(), а последняя структура использует функцию clop.Bind(). Текст запроса:
│
│ │ └─────────────────────┘
└────────────────┘
┌────────────────┐
│ │
│ ThreadNum │
│ │ ┌─────────────────────┐
│ │ │ │
├────────────────┤ ──────────────────► │ │
│ │ │ clop.Bind() │
│ OpenVad │ │ │
│ │ │ │
└────────────────┘ └─────────────────────┘
*/
type Server struct {
ServerAddress string `clop:"long" usage:"Server address"`
Rate time.Duration `clop:"long" usage:"The speed at which audio is sent"`
}
type Asr struct{
ThreadNum int `clop:"long" usage:"thread number"`
OpenVad bool `clop:"long" usage:"open vad"`
}
func main() {
asr := Asr{}
ser := Server{}
clop.MustRegister(&asr)
clop.Bind(&ser)
}
Перевод текста на русский язык:
|
| |
| |
| └─────────────────────┘
|
|
| |
| ThreadNum |
| | |
| ├───────────────────────┤
| OpenVad | clop.Bind() |
| | |
| └─────────────────────┘
*
Тип Server:
`ServerAddress` — адрес сервера (строка),
`Rate` — длительность аудио (time.Duration).
Тип Asr:
`ThreadNum` — номер потока (int),
`OpenVad` — открыт VAD (bool).
Функция main():
Создаются переменные asr и ser типа Asr и Server соответственно.
Выполняется регистрация переменной asr с помощью функции MustRegister.
Связываются переменные с помощью функции Bind.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )