Перейти к содержимому

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

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

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

$ wippy run -x app:cli
Hello from CLI!
cli-app/
├── wippy.lock
└── src/
├── _index.yaml
└── cli.lua
Окно терминала
mkdir cli-app && cd cli-app
mkdir src

Создайте 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() некуда писать.

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

local io = require("io")
local function main()
io.print("Hello from CLI!")
return 0
end
return { main = main }
Окно терминала
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[0m"
local function red(s) return "\027[31m" .. s .. reset end
local function green(s) return "\027[32m" .. s .. reset end
local function yellow(s) return "\027[33m" .. s .. reset end
local function cyan(s) return "\027[36m" .. s .. reset end
local function bold(s) return "\027[1m" .. 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 }

Вместо использования -x app:cli вы можете зарегистрировать процесс как именованную команду:

- name: cli
kind: process.lua
meta:
command:
name: greet
short: Greet the user
source: file://cli.lua
method: main
modules:
- io

Теперь запустите по имени:

Окно терминала
wippy run greet

Список всех доступных команд:

Окно терминала
wippy run list
Available commands:
greet Greet the user

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

local function main()
if error_occurred then
return 1 -- Ошибка
end
return 0 -- Успех
end
ФункцияОписание
io.print(...)Вывод в stdout с переводом строки
io.write(...)Вывод в stdout без перевода строки
io.eprint(...)Вывод в stderr с переводом строки
io.readline()Чтение строки из stdin
io.flush()Сброс буфера вывода
ФлагОписание
wippy run -x app:cliЗапуск CLI-процесса (автоопределение terminal.host)
wippy run -x app:cli --host app:termЯвное указание terminal host
wippy run -x app:cli -vС подробным логированием