Skip to main content

Validation System

Ziva provides a powerful and flexible validation system for checking user input in InputTask. The system includes built-in validators for common cases and the ability to create custom validators.

Core Concepts

Validator Interface

type Validator interface {
    Validate(input string) error
}
The validator receives an input string and returns an error if the input doesn’t meet requirements.

Applying Validation

input := ziva.NewInputTask("Email", "Enter email:").
    WithValidator(ziva.DefaultValidators.Email())
Validation is performed when confirming input (pressing Enter). If validation fails, the user is shown an error and prompted to enter data again.

Built-in Validators

Ziva provides a validator factory through ziva.DefaultValidators:

Basic Validators

v := ziva.DefaultValidators

// Required field (not empty)
validator := v.Required()

// Minimum length
validator = v.MinLength(5)

// Maximum length
validator = v.MaxLength(20)

// Exact length
validator = v.Length(8)

// Numeric range
validator = v.Range(1, 100)

Format Validators

// Email address
validator := v.Email()

// Optional email (can be empty)
validator = v.OptionalEmail()

// URL address
validator = v.URL()

// Letters and numbers only
validator = v.AlphaNumeric()

// Username
validator = v.Username()

// File/directory path
validator = v.Path()

Network Validators

// IP address (IPv4 or IPv6)
validator := v.IP()

// IPv4 only
validator = v.IPv4()

// IPv6 only
validator = v.IPv6()

// Domain name
validator = v.Domain()

// Port (1-65535)
validator = v.Port()

Password Validators

// Standard password (minimum 8 characters)
validator := v.StandardPassword()

// Strong password (minimum 12 characters, letters, numbers, symbols)
validator = v.StrongPassword()

Usage Examples

Email Validation

emailTask := ziva.NewInputTask("Email", "Enter your email:").
    WithValidator(ziva.DefaultValidators.Email())

queue := ziva.NewQueue("Registration")
queue.AddTasks(emailTask)
queue.Run()

fmt.Printf("Email: %s\n", emailTask.GetValue())

Port Validation

portTask := ziva.NewInputTask("Port", "Enter port (1-65535):").
    WithInputType(ziva.InputTypeNumber).
    WithValidator(ziva.DefaultValidators.Port())

queue := ziva.NewQueue("Server Setup")
queue.AddTasks(portTask)
queue.Run()

port, _ := strconv.Atoi(portTask.GetValue())
fmt.Printf("Port: %d\n", port)

Password Validation

passwordTask := ziva.NewInputTask("Password", "Enter password:").
    WithInputType(ziva.InputTypePassword).
    WithValidator(ziva.DefaultValidators.StrongPassword())

queue := ziva.NewQueue("Security")
queue.AddTasks(passwordTask)
queue.Run()

fmt.Println("Password set")

Complex Validation

func createUserForm() {
    v := ziva.DefaultValidators

    username := ziva.NewInputTask("Username", "Login (3-20 characters):").
        WithValidator(v.Username())

    email := ziva.NewInputTask("Email", "Email address:").
        WithValidator(v.Email())

    password := ziva.NewInputTask("Password", "Password (min 8 characters):").
        WithInputType(ziva.InputTypePassword).
        WithValidator(v.StandardPassword())

    website := ziva.NewInputTask("Website", "Website (optional):").
        WithValidator(v.OptionalURL())

    queue := ziva.NewQueue("User Registration")
    queue.AddTasks(username, email, password, website)

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

    fmt.Printf("User created:\n")
    fmt.Printf("Login: %s\n", username.GetValue())
    fmt.Printf("Email: %s\n", email.GetValue())
    fmt.Printf("Website: %s\n", website.GetValue())
}

Best Practices

1. Use Appropriate Input Types

// For numbers
task.WithInputType(ziva.InputTypeNumber).
     WithValidator(v.Range(1, 100))

// For passwords
task.WithInputType(ziva.InputTypePassword).
     WithValidator(v.StrongPassword())

// For email
task.WithInputType(ziva.InputTypeEmail).
     WithValidator(v.Email())

2. Provide Clear Error Messages

type ClearValidator struct{}

func (v *ClearValidator) Validate(input string) error {
    if len(input) < 3 {
        return errors.New("Name must contain at least 3 characters")
    }
    if len(input) > 20 {
        return errors.New("Name must not exceed 20 characters")
    }
    return nil
}

3. Validate by Context

// Different requirements for different environments
func createPasswordValidator(env string) validation.Validator {
    switch env {
    case "production":
        return ziva.DefaultValidators.StrongPassword()
    case "development":
        return ziva.DefaultValidators.StandardPassword()
    default:
        return ziva.DefaultValidators.Required()
    }
}

See Also

I