CLI-приложения

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

Что создаём

Простой CLI, который приветствует пользователя:

$ wippy run -x app:cli
Hello from CLI!

Структура проекта

cli-app/
├── wippy.lock
└── src/
    ├── _index.yaml
    └── cli.lua

Шаг 1: Создание проекта

mkdir cli-app && cd cli-app
mkdir src

Шаг 2: Определения записей

Создайте src/_index.yaml:

version: "1.0"
namespace: app

entries:
  # Terminal host связывает процессы с stdin/stdout
  - name: terminal
    kind: terminal.host
    lifecycle:
      auto_start: true

  # CLI-процесс
  - name: cli
    kind: process.lua
    source: file://cli.lua
    method: main
    modules:
      - io
terminal.host соединяет ваш Lua-процесс с терминалом. Без него io.print() некуда писать.

Шаг 3: Код CLI

Создайте src/cli.lua:

local io = require("io")

local function main()
    io.print("Hello from CLI!")
    return 0
end

return { main = main }

Шаг 4: Запуск

wippy init
wippy run -x app:cli

Вывод:

Hello from CLI!
Флаг -x автоматически определяет ваш terminal.host и запускается в тихом режиме для чистого вывода.

Чтение пользовательского ввода

local io = require("io")

local function main()
    io.write("Enter your name: ")
    local name = io.readline()

    if name and #name > 0 then
        io.print("Hello, " .. name .. "!")
    else
        io.print("Hello, stranger!")
    end

    return 0
end

return { main = main }

Цветной вывод

Используйте ANSI escape-коды для цветов:

local io = require("io")

local reset = "\027"
local function red(s) return "\027" .. s .. reset end
local function green(s) return "\027" .. s .. reset end
local function yellow(s) return "\027" .. s .. reset end
local function cyan(s) return "\027" .. s .. reset end
local function bold(s) return "\027" .. s .. reset end

local function main()
    io.print(bold(cyan("Welcome!")))
    io.write(yellow("Enter a number: "))

    local input = io.readline()
    local n = tonumber(input)

    if n then
        io.print("Squared: " .. green(tostring(n * n)))
        return 0
    else
        io.print(red("Error: ") .. "not a number")
        return 1
    end
end

return { main = main }

Системная информация

Доступ к статистике рантайма через модуль system:

# Добавьте к определению записи
modules:
  - io
  - system
local io = require("io")
local system = require("system")

local function main()
    io.print("Host: " .. system.process.hostname())
    io.print("CPUs: " .. system.runtime.cpu_count())
    io.print("Goroutines: " .. system.runtime.goroutines())

    local mem = system.memory.stats()
    io.print("Memory: " .. string.format("%.1f MB", mem.heap_alloc / 1024 / 1024))

    return 0
end

return { main = main }

Коды завершения

Возвращайте значение из main() для установки кода завершения:

local function main()
    if error_occurred then
        return 1  -- Ошибка
    end
    return 0      -- Успех
end

Справочник I/O

Функция Описание
io.print(...) Вывод в stdout с переводом строки
io.write(...) Вывод в stdout без перевода строки
io.eprint(...) Вывод в stderr с переводом строки
io.readline() Чтение строки из stdin
io.flush() Сброс буфера вывода

Флаги CLI

Флаг Описание
wippy run -x app:cli Запуск CLI-процесса (автоопределение terminal.host)
wippy run -x app:cli --host app:term Явное указание terminal host
wippy run -x app:cli -v С подробным логированием

Следующие шаги