Coline предоставляет тонкую и многократно используемую структуру для определения приложений командной строки с интерфейсом верхнего уровня и несколькими диалоговыми окнами вопросов и ответов. Он написан на Node.js и опубликован с открытым исходным кодом в репозитории Github и NPM.

Coline — мой первый проект с открытым исходным кодом, а также мой первый проект по программированию за очень долгое время. В этом посте объясняется сценарий приложения, для которого я хотел создать фреймворк, и в общих чертах описан технический подход, который я использовал для создания фреймворка.

Таинственный обед

Во время таинственного обеда люди случайным образом распределяются по группам и вместе едят. Особенности включают в себя:

  • Определите название и время обеденного мероприятия
  • Добавить людей на обеденное мероприятие
  • Запланируйте обед, случайным образом разделив людей на группы.

Приложение должно задать мне набор вопросов, с помощью которых можно создать такое событие. Это должно быть приложение, которое вы запускаете из терминала. Пример диалога здесь:

$› Как называется мероприятие? (любые признаки)

$: Пробный обед

$› Когда это событие произойдет? (Любые знаки / «Назад»)

$: 2018–11–27

$› Кто участвует? (Любые знаки, разделенные запятой / «Назад»)

$: Себастьян, Карл, Леа, Каро, Ганс, Роджер

$› Создать это событие? («Да» / «Назад»)

- НАЗВАНИЕ: Пробный обед

— ДАТА: 2018–11–27

— ЛЮДИ: Себастьян, Карл, Леа, Каро, Ганс, Роджер

$: Да

$› Спасибо, мероприятие добавлено

Технический подход

Подход развивался со временем. Проверив существующие проекты с открытым исходным кодом, такие как Commander, Inquirer или модуль Node.js Readline. Я узнал об обработке событий, асинхронных функциях и работе с stdin и stdout.

Подход эволюционировал к этому набору проблем:

  1. Запись в стандартный вывод (с настраиваемой подсказкой) и чтение из стандартного ввода
  2. Определение пользовательского интерфейса, который загружается, когда приложение запускается, чтобы сообщить пользователю об основных командах, и который предоставляет привязки key =› command, которые вызываются, когда пользователь нажимает клавишу
  3. Определение диалогов, которые задают вопросы, подтверждают ввод и позволяют вернуться или выйти из диалога

Каждая проблема должна быть реализована как отдельный компонент. Приложение инициализирует подсказку, записывает сообщение и пользовательский интерфейс, а затем ожидает обработки пользовательского ввода. С этим наброском можно было начинать разработку.

В следующем посте я продолжу выбор дизайна и расскажу, как развивалось разделение задач.