- разбор документа по языку конвенций: шапка, области правил, блоки под метками - проверки формы правила, распространения, ссылок и самого suite.toml - словарь языка живёт в бинаре реестром «версия × естественный язык», темы и префиксы берутся только из манифеста
105 lines
3.6 KiB
Go
105 lines
3.6 KiB
Go
// Package cli раскладывает команды инструмента.
|
||
//
|
||
// Глубина команды отражает частоту и адресата: проектные команды выполняются в
|
||
// каждом репозитории и часто, ведение набора — в одном репозитории и редко.
|
||
// Поэтому `check` стоит наверху, а под `suite` уходит то, что в проекте не
|
||
// имеет смысла. Синонимов нет: `convy suite pull` рядом с `convy pull` не
|
||
// заводится.
|
||
package cli
|
||
|
||
import (
|
||
"fmt"
|
||
"io"
|
||
"os"
|
||
)
|
||
|
||
// ExitCode — код возврата процесса.
|
||
type ExitCode int
|
||
|
||
const (
|
||
// OK — проверка прошла, работа сделана.
|
||
OK ExitCode = 0
|
||
// Failed — проверка нашла ошибки.
|
||
Failed ExitCode = 1
|
||
// Usage — команда набрана неверно или не в том контексте.
|
||
Usage ExitCode = 2
|
||
)
|
||
|
||
// Env — окружение запуска. Вынесено, чтобы команды тестировались без процесса.
|
||
type Env struct {
|
||
Dir string
|
||
Out io.Writer
|
||
Err io.Writer
|
||
NoTTY bool
|
||
Colors bool
|
||
}
|
||
|
||
// Run разбирает аргументы и выполняет команду.
|
||
func Run(env Env, args []string) ExitCode {
|
||
if len(args) == 0 {
|
||
usage(env.Out)
|
||
return Usage
|
||
}
|
||
|
||
switch args[0] {
|
||
case "suite":
|
||
return runSuite(env, args[1:])
|
||
case "add", "pull", "list", "check":
|
||
fmt.Fprintf(env.Err, "команда %q ещё не реализована\n", args[0])
|
||
return Usage
|
||
case "help", "-h", "--help":
|
||
usage(env.Out)
|
||
return OK
|
||
default:
|
||
fmt.Fprintf(env.Err, "неизвестная команда %q\n\n", args[0])
|
||
usage(env.Err)
|
||
return Usage
|
||
}
|
||
}
|
||
|
||
func runSuite(env Env, args []string) ExitCode {
|
||
if len(args) == 0 {
|
||
fmt.Fprintln(env.Err, "convy suite: нужна подкоманда — check")
|
||
return Usage
|
||
}
|
||
switch args[0] {
|
||
case "check":
|
||
return runSuiteCheck(env, args[1:])
|
||
case "new":
|
||
fmt.Fprintln(env.Err, "команда \"suite new\" ещё не реализована")
|
||
return Usage
|
||
default:
|
||
fmt.Fprintf(env.Err, "неизвестная подкоманда %q для convy suite\n", args[0])
|
||
return Usage
|
||
}
|
||
}
|
||
|
||
// usage печатает помощь, сгруппированную заголовками: в плоском списке уровни
|
||
// не видны.
|
||
func usage(w io.Writer) {
|
||
fmt.Fprint(w, `convy — управление конвенциями разработки.
|
||
|
||
В проекте:
|
||
convy add <тема> подписаться и собрать (не реализовано)
|
||
convy pull пересобрать подписанное (не реализовано)
|
||
convy list что подключено и что доступно (не реализовано)
|
||
convy check проверить форму того, что здесь (не реализовано)
|
||
|
||
В наборе:
|
||
convy suite check целостность набора: префиксы, темы, оси, ссылки, форма
|
||
convy suite new новая тема (не реализовано)
|
||
|
||
`)
|
||
}
|
||
|
||
// Main — точка входа процесса.
|
||
func Main() int {
|
||
dir, err := os.Getwd()
|
||
if err != nil {
|
||
fmt.Fprintln(os.Stderr, "не удалось определить текущую директорию:", err)
|
||
return int(Usage)
|
||
}
|
||
env := Env{Dir: dir, Out: os.Stdout, Err: os.Stderr}
|
||
return int(Run(env, os.Args[1:]))
|
||
}
|