Базовые примеры использования
Эта страница содержит практические примеры создания TUI приложений с помощью Ziva. Все примеры готовы к запуску и демонстрируют основные возможности библиотеки.Пример 1: Простое подтверждение
Базовый пример с задачей подтверждения:Copy
Ask AI
package main
import (
"fmt"
"log"
"github.com/qzeleza/ziva"
)
func main() {
// Создаем задачу подтверждения
confirm := ziva.NewYesNoTask(
"Подтверждение действия",
"Удалить все временные файлы?",
)
// Создаем очередь и добавляем задачу
queue := ziva.NewQueue("Очистка системы")
queue.AddTasks(confirm)
// Запускаем
if err := queue.Run(); err != nil {
log.Fatal(err)
}
// Обрабатываем результат
if confirm.IsYes() {
fmt.Println("🗑️ Временные файлы удалены")
} else {
fmt.Println("❌ Операция отменена")
}
}
Пример 2: Выбор из списка
Пример с выбором одного варианта из списка:Copy
Ask AI
package main
import (
"fmt"
"log"
"github.com/qzeleza/ziva"
)
func main() {
// Опции с описаниями
environments := []string{
"dev||Среда разработки - локальная машина",
"staging||Тестовая среда - для QA",
"production||Боевая среда - пользователи",
}
// Создаем задачу выбора
envTask := ziva.NewSingleSelectTask(
"Выбор среды развертывания",
environments,
).WithDefaultItem("staging")
// Настраиваем и запускаем очередь
queue := ziva.NewQueue("Развертывание приложения")
queue.WithAppName("DeployTool")
queue.AddTasks(envTask)
if err := queue.Run(); err != nil {
log.Fatal(err)
}
// Получаем результат
selected := envTask.GetSelected()
fmt.Printf("🚀 Развертывание в среду: %s\n", selected)
}
Пример 3: Множественный выбор
Пример с выбором нескольких компонентов:Copy
Ask AI
package main
import (
"fmt"
"log"
"strings"
"github.com/qzeleza/ziva"
)
func main() {
// Компоненты для установки
components := []string{
"web||Веб-сервер",
"api||REST API",
"db||База данных",
"cache||Кеширование",
"monitoring||Мониторинг",
"backup||Резервное копирование",
}
// Создаем задачу множественного выбора
compTask := ziva.NewMultiSelectTask(
"Выберите компоненты для установки",
components,
).WithSelectAll("Установить все").
WithDefaultItems([]string{"web", "api"})
queue := ziva.NewQueue("Установка системы")
queue.AddTasks(compTask)
if err := queue.Run(); err != nil {
log.Fatal(err)
}
// Показываем выбранные компоненты
selected := compTask.GetSelected()
if len(selected) > 0 {
fmt.Printf("📦 Будут установлены: %s\n",
strings.Join(selected, ", "))
} else {
fmt.Println("❌ Не выбрано ни одного компонента")
}
}
Пример 4: Ввод с валидацией
Пример сбора пользовательских данных с валидацией:Copy
Ask AI
package main
import (
"fmt"
"log"
"github.com/qzeleza/ziva"
)
func main() {
v := ziva.DefaultValidators
// Создаем поля ввода с валидацией
name := ziva.NewInputTask("Имя", "Введите ваше имя:").
WithValidator(v.Required())
email := ziva.NewInputTask("Email", "Введите email:").
WithInputType(ziva.InputTypeEmail).
WithValidator(v.Email())
website := ziva.NewInputTask("Сайт", "URL сайта (опционально):").
WithValidator(v.OptionalURL())
// Создаем очередь
queue := ziva.NewQueue("Регистрация пользователя")
queue.WithAppName("UserReg")
queue.AddTasks(name, email, website)
if err := queue.Run(); err != nil {
log.Fatal(err)
}
// Выводим собранную информацию
fmt.Println("\n✅ Регистрация завершена:")
fmt.Printf("Имя: %s\n", name.GetValue())
fmt.Printf("Email: %s\n", email.GetValue())
if website.GetValue() != "" {
fmt.Printf("Сайт: %s\n", website.GetValue())
}
}
Пример 5: Функциональная задача
Пример выполнения длительной операции:Copy
Ask AI
package main
import (
"log"
"math/rand"
"time"
"github.com/qzeleza/ziva"
)
func main() {
// Данные для отчета
var stats struct {
FilesProcessed int
Errors int
Duration time.Duration
}
// Создаем функциональную задачу
processTask := ziva.NewFuncTask(
"Обработка файлов",
func() error {
start := time.Now()
// Имитация обработки файлов
for i := 0; i < 100; i++ {
time.Sleep(50 * time.Millisecond)
stats.FilesProcessed++
// Случайные ошибки
if rand.Intn(20) == 0 {
stats.Errors++
}
}
stats.Duration = time.Since(start)
return nil
},
// Функция сводки результатов
ziva.WithSummaryFunction(func() []string {
return []string{
fmt.Sprintf("Обработано файлов: %d", stats.FilesProcessed),
fmt.Sprintf("Ошибок: %d", stats.Errors),
fmt.Sprintf("Время выполнения: %v", stats.Duration.Round(time.Millisecond)),
}
}),
)
queue := ziva.NewQueue("Пакетная обработка")
queue.AddTasks(processTask)
if err := queue.Run(); err != nil {
log.Fatal(err)
}
}
Пример 6: Комплексное приложение
Полный пример настройки веб-сервера:Copy
Ask AI
package main
import (
"fmt"
"log"
"strconv"
"time"
"github.com/qzeleza/ziva"
)
type ServerConfig struct {
Host string
Port int
SSL bool
CertPath string
Modules []string
}
func main() {
config := &ServerConfig{}
// Создаем задачи конфигурации
tasks := createConfigTasks(config)
// Настраиваем очередь
queue := ziva.NewQueue("Настройка веб-сервера")
queue.WithAppName("WebServerSetup").
WithTasksNumbered(true, "[%02d]").
WithTitleColor(ziva.BlueBright, true)
queue.AddTasks(tasks...)
if err := queue.Run(); err != nil {
log.Fatal(err)
}
// Показываем итоговую конфигурацию
printConfig(config)
}
func createConfigTasks(config *ServerConfig) []ziva.Task {
v := ziva.DefaultValidators
// 1. Хост
hostTask := ziva.NewInputTask("Хост сервера", "IP адрес или домен:").
WithValidator(v.Required()).
WithTimeout(30*time.Second, "localhost")
// 2. Порт
portTask := ziva.NewInputTask("Порт", "Порт сервера (1-65535):").
WithInputType(ziva.InputTypeNumber).
WithValidator(v.Port()).
WithTimeout(15*time.Second, "8080")
// 3. SSL
sslTask := ziva.NewYesNoTask("SSL", "Включить HTTPS?").
WithDefaultItem("Да")
// 4. Модули
modules := []string{
"auth||Аутентификация пользователей",
"cors||Cross-Origin Resource Sharing",
"compress||Сжатие ответов",
"static||Статические файлы",
"proxy||Обратный прокси",
"cache||Кеширование",
}
moduleTask := ziva.NewMultiSelectTask("Модули", modules).
WithSelectAll("Включить все модули").
WithDefaultItems([]string{"auth", "static"})
// 5. Функциональная задача применения конфигурации
applyTask := ziva.NewFuncTask(
"Применение конфигурации",
func() error {
// Собираем конфигурацию
config.Host = hostTask.GetValue()
if port, err := strconv.Atoi(portTask.GetValue()); err == nil {
config.Port = port
}
config.SSL = sslTask.IsYes()
config.Modules = moduleTask.GetSelected()
// Имитация применения настроек
time.Sleep(2 * time.Second)
return nil
},
ziva.WithSummaryFunction(func() []string {
return []string{
"Конфигурация применена",
"Сервер готов к запуску",
}
}),
)
return []ziva.Task{hostTask, portTask, sslTask, moduleTask, applyTask}
}
func printConfig(config *ServerConfig) {
fmt.Println("\n🔧 Конфигурация сервера:")
fmt.Printf("Адрес: %s:%d\n", config.Host, config.Port)
fmt.Printf("SSL: %v\n", config.SSL)
fmt.Printf("Модули: %v\n", config.Modules)
// URL для подключения
protocol := "http"
if config.SSL {
protocol = "https"
}
fmt.Printf("\n🌐 URL: %s://%s:%d\n", protocol, config.Host, config.Port)
}
Советы по использованию
1. Группировка задач
Логически группируйте связанные задачи:Copy
Ask AI
// Группа аутентификации
authTasks := []ziva.Task{
ziva.NewInputTask("Username", "Логин:"),
ziva.NewInputTask("Password", "Пароль:").WithInputType(ziva.InputTypePassword),
}
// Группа настроек
configTasks := []ziva.Task{
ziva.NewSingleSelectTask("Theme", themes),
ziva.NewYesNoTask("Notifications", "Включить уведомления?"),
}
queue.AddTasks(authTasks...)
queue.AddTasks(configTasks...)
2. Обработка отмены
Copy
Ask AI
queue := ziva.NewQueue("Setup")
if err := queue.Run(); err != nil {
if err == context.Canceled {
fmt.Println("❌ Настройка отменена пользователем")
return
}
log.Fatal(err)
}
3. Сохранение конфигурации
Copy
Ask AI
// После успешного выполнения
config := collectResults(tasks...)
if err := saveConfig(config); err != nil {
log.Printf("Ошибка сохранения: %v", err)
}
См. также
- Продвинутые примеры - сложные сценарии использования
- Компоненты - подробности о каждом компоненте
- Валидация - система валидации данных