Files
convy/internal/cli/cli.go
T
av ccf046fb7b suite check: реализована проверка целостности набора
- разбор документа по языку конвенций: шапка, области правил, блоки под метками
- проверки формы правила, распространения, ссылок и самого suite.toml
- словарь языка живёт в бинаре реестром «версия × естественный язык», темы и
  префиксы берутся только из манифеста
2026-07-27 09:53:07 +03:00

105 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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:]))
}