1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/guonaihong-clop

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

clop

clop (Command Line Option Parse) — это основанный на struct командный анализатор, который мал, но полон функций.

Особенности

  • Поддержка привязки к переменным среды: env DEBUG=xx ./proc.
  • Сбор параметров в виде списка: можно собрать параметры a.txt, b.txt в список и добавить их в указанную структуру.
  • Короткие и длинные опции: proc -d или proc --debug.
  • Поддержка стиля POSIX для командных строк: команды вида ls -ltr могут быть записаны как ls -l -t -r. Это упрощает реализацию стандартных команд POSIX.
  • Поддержка подкоманд (subcommand): позволяет реализовать подкоманды в стиле git, такие как git add. Регистрация подкоманд проста: достаточно создать структуру, и вы сможете использовать clop для реализации неограниченного количества подкоманд.
  • Значения по умолчанию: поддержка различных типов данных, что избавляет от необходимости преобразования типов.
  • Проверка на повторяющиеся команды.
  • Строгая проверка коротких и длинных опций: предотвращает двусмысленность опций.
  • Режим проверки: не нужно писать код вроде if x!= "" или if y!=0.
  • Получение приоритета команды: удобно для настройки псевдонимов команд.
  • Генерация кода clop из кода пакета flag.
  • Указание функции разбора: автоматическое связывание данных.

Содержание

  • Установка.
  • Быстрый старт.
  • Пример использования:
    • Базовый тип:
      • int.
      • float64.
      • time.Duration.
      • string.
    • Массив:
      • Аналогично команде curl.
      • Аналогично команде join.
      1. Как использовать обязательные теги.
      1. Поддержка переменных среды:
      • 2.1 Пользовательское имя переменной среды.
      • 2.2 Быстрое создание переменных среды.
      1. Установка значения по умолчанию.
      1. Реализация команд в стиле git:
      • 4.1 Метод реализации подкоманды 1.
      • 4.2 Метод реализации подкоманды 2.
      1. Получение приоритета команды.
      1. Можно установить только один раз.
      1. Быстрая запись.
      1. Серия многоструктурных команд.
      1. Поддержка функции обратного вызова при разборе.
    • Расширенные функции:
      • Генерация кода clop на основе кода флага.
  • Реализация параметров команд Linux:
    • cat.

Установка

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 )

Вы можете оставить комментарий после Вход в систему

Введение

^=^ clop — это библиотека для анализа командной строки на основе struct. Его душа — в простоте, мощности и фокусировке, как у AK. Он помогает избавиться от всех проблем и сложностей в командной строке [реализовано с нуля]. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/guonaihong-clop.git
git@api.gitlife.ru:oschina-mirror/guonaihong-clop.git
oschina-mirror
guonaihong-clop
guonaihong-clop
master