> ## Documentation Index
> Fetch the complete documentation index at: https://ziva.zeleza.ru/llms.txt
> Use this file to discover all available pages before exploring further.

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

> Как управлять последовательностью задач в Ziva и настраивать поведение очереди

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

`Queue` — центральный оркестратор Ziva. Он последовательно запускает задачи, управляет отображением статусов и обеспечивает единый цикл ввода/вывода в терминале.

## Создание и запуск

```go theme={null}
queue := ziva.NewQueue("Развертывание MyApp")

queue.AddTasks(
    ziva.NewYesNoTask("Подтверждение", "Начать установку?"),
    ziva.NewSingleSelectTask("Выбор среды", []string{"dev", "staging", "prod"}),
)

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

<img src="https://mintcdn.com/terem/7tfdR1JkDhuUAiXc/images/pic_5.png?fit=max&auto=format&n=7tfdR1JkDhuUAiXc&q=85&s=c969bea304b96b8f8b766f68d3c2ae09" alt="Скриншот: итоговая сводка очереди" width="966" height="620" data-path="images/pic_5.png" />

<Info>
  Сохраняйте ссылки на созданные задачи, если нужно считать их результат после `Run()`.
</Info>

## Добавление задач

```go theme={null}
queue.AddTasks(task1)                 // одиночная задача
queue.AddTasks(task1, task2, task3)   // несколько задач сразу
queue.AddTasks(task1).AddTasks(task2) // цепочка вызовов
```

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

## Настройка отображения

### Имя приложения и заголовок

```go theme={null}
queue.
  WithAppName("Deploy CLI").              // надпись в шапке
  WithAppNameColor(ziva.BlueBright, true).
  WithTitleColor(ziva.GreenBright, false)
```

Для цветов используйте функции `lipgloss.Color()` либо готовые константы Ziva (`ziva.BlueBright`, `ziva.GrayDark` и т.д.).

### Нумерация задач

```go theme={null}
queue.WithTasksNumbered(false, "[%02d]") // [01], [02], ... без сохранения исходного символа
queue.WithTasksNumbered(true, "(%d)")    // (1), (2), ... первый символ формата сохраняется
```

Первый параметр (`keepFirstSymbol`) определяет, нужно ли сохранять символ завершения (`✔`, `✗`) для первой задачи. Формат — любая строка для `fmt.Sprintf`.

### Сводка и разделительные линии

```go theme={null}
queue.WithOutSummary()   // убрать финальный блок-резюме
queue.WithOutResultLine()    // отключить разделительные линии перед результатами задач
```

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

### Очистка экрана

```go theme={null}
queue.WithClearScreen(true) // очистка терминала перед запуском очереди
```

Полезно, если приложение должно стартовать «с чистого листа». Для встроенных устройств, наоборот, часто удобно оставить вывод предыдущих команд.

## Чтение результатов задач

```go theme={null}
yesno := ziva.NewYesNoTask("Подтверждение", "Продолжить?")
choice := ziva.NewSingleSelectTask("Выберите среду", envs)

queue := ziva.NewQueue("Демо")
queue.AddTasks(yesno, choice)
_ = queue.Run()

if yesno.IsYes() {
    fmt.Printf("Среда: %s\n", choice.GetSelected())
}
```

Данные хранятся внутри объектов задач. Вам не нужно передавать дополнительные колбэки — достаточно доступа к экземплярам.

## Обработка ошибок и отмены

* Пользователь может прервать очередь (`Ctrl+C`). В этом случае `Run()` вернёт ошибку, которую можно обработать.
* Используйте `FuncTask.WithStopOnError(true)`, чтобы оборвать очередь при сбое важной операции.
* Для дружелюбного вывода сообщений об ошибке изменяйте глобальные цвета через `ziva.SetErrorColor()`.

## Производительность и ресурсы

Ziva содержит встроенные механизмы контроля памяти. Их удобно конфигурировать через переменные окружения:

```bash theme={null}
export ZIVA_MAX_COMPLETED_TASKS=10          # лимит хранения завершённых задач
export ZIVA_MEMORY_PRESSURE_THRESHOLD=80M  # порог очистки кэша
```

Для сред с ограниченными ресурсами:

```go theme={null}
ziva.AutoConfigure()     // единоразовая автоконфигурация
ziva.EnableEmbeddedMode() // упрощённая цветовая схема и макет
```

## Лучшие практики

* **Минимизируйте побочные эффекты в задачах.** Пусть каждая задача отвечает только за свой ввод/вывод.
* **Готовьте данные заранее.** Формируйте списки вариантов и дефолтные значения до создания задач.
* **Логируйте за пределами очереди.** Queue управляет только TUI. Используйте отдельные журналы для внутреннего состояния приложения.
* **Сохраняйте результаты.** После `Run()` извлеките значения и сохраните их в собственных структурах, пока пользователь помнит контекст.
* **Разделяйте сценарии.** Лучше несколько небольших очередей, чем одна гигантская — пользователю проще ориентироваться.

## Связанные материалы

* [Типы задач](/ru/components/tasks)
* [Настройка цветов и стилей](/ru/customization/colors)
* [Оптимизация под встроенные системы](/ru/customization/embedded-systems)
