Comments 8
А что за CLI пишутся на тайпскрипте? Речь про ноду?
The
or()
combinator means exactly one succeeds.
Оно должно бы было называться либо "xor", либо по-английски "either".
but because I was tired of seeing—and writing—the same validation code everywhere.
Все уже придумано до вас. Питоновский argparse (и порты) - парсилка здорового человека. Остальное ложится на пользователя:
conflict_handler
argument_default
Но использование и интеграция в систему типов TS выглядит удобной.
PS: По-другому можно выразиться, что надо проверять рано и fail-fast. До ухода в логику программы проверять опции, заполнять нужные поля. Таким образом бизнес-логике остается только пользоваться геттерами. Валидация логики по всей программе -- это как болезнь распространяющая всюду. Вместо этого иметь строгий "вход" данных внутрь периметра и единообразный "вывод" наружу.
Парсилка здорового человека — это optparse-applicative и, для ленивых, optparse-generic.
Как раз, кстати, парсится в по построению валидную структуру данных.
Не случайно, значит, исходная статья, на которую ссылается автор здесь, основана на Хаскеле: https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/
Нельзя разбирать данные в рыхлый тип, а затем проверять, валидны ли они.
Мда.
Забавно, не приходило в голову подобные вещи начинать не с типов данных, а, напротив, с описания разбора опций и их комбинаций, позволяя выводить типы компилятору.
Почему бы и нет, но не вполне понятно, чем это лучше того, чтобы просто на входе в cli-приложение массив аргументов отдать парсеру, а получить от него типизированные параметры. И больше нигде в приложении не вспоминать, что оно - консольное
Хватит валидировать CLI — сначала лучше распарсите код как следует