// 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:])) }