> ## 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.

# InputTask

> Текстовый ввод с типами полей, таймаутами и встроенной валидацией

# InputTask

`InputTask` отвечает за ввод строковых значений. Он поддерживает разные типы полей (пароль, email, IP и т.д.), таймауты, форматирование и подключение валидаторов.

## Создание

```go theme={null}
name := ziva.NewInputTask("Имя проекта", "Введите название:")
```

<img src="https://mintcdn.com/terem/7tfdR1JkDhuUAiXc/images/pic_4.png?fit=max&auto=format&n=7tfdR1JkDhuUAiXc&q=85&s=730b5c0561aa83a054e11f906d7a49b0" alt="Скриншот: ввод с валидацией" width="961" height="556" data-path="images/pic_4.png" />

## Настройки

### Тип ввода

```go theme={null}
name.WithInputType(ziva.InputTypeText)
password := ziva.NewInputTask("Пароль", "Введите пароль:").
    WithInputType(ziva.InputTypePassword)
```

Доступные типы:

```go theme={null}
const (
    ziva.InputTypeText     // обычный текст
    ziva.InputTypePassword // скрытый ввод
    ziva.InputTypeEmail    // email
    ziva.InputTypeNumber   // число
    ziva.InputTypeIP       // IP адрес
    ziva.InputTypeDomain   // доменное имя
)
```

При выборе типа автоматически подставляется подходящий валидатор (если его не задали вручную).

### Валидаторы

```go theme={null}
v := ziva.DefaultValidators

name.WithValidator(v.Username())
email := ziva.NewInputTask("Email", "Введите email:").
    WithInputType(ziva.InputTypeEmail).
    WithValidator(v.Email())
```

Вы также можете реализовать собственный валидатор — достаточно типа с методами `Validate(string) error` и `Description() string`.

### Таймаут и значение по умолчанию

```go theme={null}
name.WithTimeout(30*time.Second, "demo-app")
```

### Плейсхолдер, ширина и пустые значения

```go theme={null}
name.
  WithPlaceholder("например, billing-service").
  WithWidth(40).                     // минимальные/максимальные ограничения применяются автоматически
  WithVisibleLength(20).             // управляет видимой частью ввода и включает горизонтальный скролл
  WithAllowEmpty(false)              // запретить пустой ввод
```

## Получение результата

```go theme={null}
queue := ziva.NewQueue("Регистрация")
queue.AddTasks(name)
_ = queue.Run()

fmt.Println("Имя проекта:", name.GetValue())
```

## Пример формы

```go theme={null}
func askCredentials() (string, string) {
    v := ziva.DefaultValidators

    login := ziva.NewInputTask("Логин", "Имя пользователя:").
        WithValidator(v.Username())

    password := ziva.NewInputTask("Пароль", "Пароль (>=12 символов):").
        WithInputType(ziva.InputTypePassword).
        WithValidator(v.StrongPassword())

    queue := ziva.NewQueue("Авторизация")
    queue.AddTasks(login, password)
    _ = queue.Run()

    return login.GetValue(), password.GetValue()
}
```

## Советы

* Разрешайте пустой ввод (`WithAllowEmpty(true)`), если поле опциональное. При необходимости отдельно проверяйте значение после очереди.
* Показывайте примеры в плейсхолдерах — пользователю проще понять формат.
* Сохраняйте ссылку на задачу, пока нужно значение, поскольку оно хранится внутри `InputTask`.
* Для комбинированной проверки (например, email + домен) используйте `FuncTask` после `InputTask`, где можете выполнить дополнительные проверки и вывести подсказку.

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

* [Валидация данных](/ru/validation/overview)
* [FuncTask](/ru/components/func-task)
