Перейти к основному содержанию

Быстрый старт

В этом руководстве мы создадим простое TUI приложение, демонстрирующее основные возможности Ziva. Скриншот: базовая очередь Ziva

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

Создайте свой новый Go проект:
mkdir my-ziva-demo
cd my-ziva-demo
go mod init my-ziva-demo
go get github.com/qzeleza/ziva

Шаг 2: Базовое приложение

Создайте файл main.go:
package main

import (
    "fmt"
    "log"
    "time"
    "github.com/qzeleza/ziva"
)

func main() {
    // Создаем очередь задач с заголовком
    queue := ziva.NewQueue("Демо приложение Ziva")

    // Настраиваем внешний вид
    queue.WithAppName("MyApp")
	// Добавляем нумерацию задач в очереди
    queue.WithTasksNumbered(false, "[%d]")

    // Создаем задачи
    createTasks(queue)

    // Запускаем очередь
    if err := queue.Run(); err != nil {
        log.Fatal(err)
    }

    // Выводим результаты
    printResults()
}

// Создание задачи
func createTasks(queue *ziva.Queue) {

    // 1. Задача подтверждения с таймаутом
    confirm := ziva.NewYesNoTask("Подтверждение", "Начать настройку?").
        WithTimeout(5*time.Second, "Да")

    // 2. Выбор среды 
	// в виде: имя_пункта_меню||справка_к_пункту_меню
    environments := []ziva.Item{
        {Key: "development", Name: "development", Description: "Среда разработки"},
        {Key: "staging", Name: "staging", Description: "Тестовая среда"},
        {Key: "production", Name: "production", Description: "Боевая среда"},
    }
	// По умолчанию маркер будет указывать на "staging"
    env := ziva.NewSingleSelectTask("Выбор среды", environments).
        WithDefaultItem("staging")

    // 3. Выбор компонентов
    components := []ziva.Item{
        {Key: "api", Name: "api", Description: "REST API сервер"},
        {Key: "web", Name: "web", Description: "Веб интерфейс"},
        {Key: "cli", Name: "cli", Description: "Командная строка"},
        {Key: "docs", Name: "docs", Description: "Документация"},
    }
	// Добавляем пункт "Выбрать все"
    comp := ziva.NewMultiSelectTask("Компоненты", components).
        WithSelectAll("Выбрать все").
        WithDefaultItems([]string{"api", "cli"})

    // 4. Ввод имени проекта с валидацией
    name := ziva.NewInputTask("Имя проекта", "Введите название:").
        WithValidator(ziva.DefaultValidators.Required())

    // 5. Функциональная задача
    setup := ziva.NewFuncTask("Настройка", func() error {
        time.Sleep(2 * time.Second) // Имитация работы
        return nil
    }, ziva.WithSummaryFunction(func() []string {
        return []string{"Конфигурация создана", "Проект готов к работе"}
    }))

    // Добавляем все задачи в очередь
    queue.AddTasks(confirm, env, comp, name, setup)
}

func printResults() {
    fmt.Println("\n🎉 Приложение завершено!")
    fmt.Println("Результаты сохранены в объектах задач.")
}

Шаг 3: Запуск

Запустите приложение:
go run main.go
Вы увидите интерактивный интерфейс с различными типами задач.

Шаг 4: Работа с результатами

Расширим пример для работы с результатами:
func printResults(confirm *ziva.YesNoTask, env *ziva.SingleSelectTask,
                 comp *ziva.MultiSelectTask, name *ziva.InputTask) {
    fmt.Println("\n📋 Результаты конфигурации:")
    fmt.Printf("Подтверждение: %v\n", confirm.IsYes())
    fmt.Printf("Среда: %s\n", env.GetSelected()) // возвращает ключ
    fmt.Printf("Компоненты: %v\n", comp.GetSelected()) // список ключей
    fmt.Printf("Имя проекта: %s\n", name.GetValue())
}
И обновим main:
func main() {
    queue := ziva.NewQueue("Демо приложение Ziva")

    // Создаем задачи с сохранением ссылок
    confirm, env, comp, name := createTasksWithReferences(queue)

    if err := queue.Run(); err != nil {
        log.Fatal(err)
    }

    // Выводим результаты
    printResults(confirm, env, comp, name)
}

Основные концепции

Очередь задач (Queue)

Центральный компонент, который управляет последовательным выполнением задач:
queue := ziva.NewQueue("Заголовок")
queue.WithAppName("MyApp")      // Имя приложения
queue.WithClearScreen(true)     // Очистка экрана
queue.WithTasksNumbered(true, "[%02d]") // Нумерация задач

Типы задач

  1. YesNoTask - выбор Да/Нет
  2. SingleSelectTask - выбор одного варианта
  3. MultiSelectTask - выбор нескольких вариантов
  4. InputTask - ввод текста с валидацией
  5. FuncTask - выполнение функции

Таймауты

Все задачи поддерживают таймауты с значениями по умолчанию:
task.WithTimeout(10*time.Second, defaultValue)

Валидация

Встроенные валидаторы для различных типов данных:
v := ziva.DefaultValidators
inputTask.WithValidator(v.Email())        // Email
inputTask.WithValidator(v.IP())           // IP адрес
inputTask.WithValidator(v.MinLength(5))   // Минимальная длина

Что дальше?

I