Ana içeriğe atla

Doğrulama Vitirini

Bu rehber Ziva ile güvenilir formlar kurmayı gösterir: tüm yerleşik doğrulayıcıları kapsar, zincirler oluşturur ve harici kontroller ekler.

Tüm yerleşik doğrulayıcılarla kuyruk

func ShowBuiltInValidators() {
    v := ziva.DefaultValidators

    tasks := []ziva.Task{
        ziva.NewInputTask("Ad", "Zorunlu alan:").
            WithValidator(v.Required()),

        ziva.NewInputTask("Kullanıcı adı", "3-20 karakter, latin/rakam:").
            WithValidator(v.Username()),

        ziva.NewInputTask("Kısa açıklama", "En fazla 40 karakter:").
            WithValidator(v.MaxLength(40)),

        ziva.NewInputTask("Yorum", "En az 5 karakter:").
            WithValidator(v.MinLength(5)),

        ziva.NewInputTask("Kod", "Tam 8 karakter:").
            WithValidator(v.Length(8)),

        ziva.NewInputTask("Email", "E-posta adresi:").
            WithInputType(ziva.InputTypeEmail).
            WithValidator(v.Email()),

        ziva.NewInputTask("Site", "URL (opsiyonel):").
            WithValidator(v.OptionalURL()),

        ziva.NewInputTask("IP", "IPv4 veya IPv6:").
            WithInputType(ziva.InputTypeIP).
            WithValidator(v.IP()),

        ziva.NewInputTask("Alan adı", "Domain:").
            WithInputType(ziva.InputTypeDomain).
            WithValidator(v.Domain()),

        ziva.NewInputTask("Port", "1-65535 arası:").
            WithInputType(ziva.InputTypeNumber).
            WithValidator(v.Port()),

        ziva.NewInputTask("Sayı", "1-100 arası:").
            WithInputType(ziva.InputTypeNumber).
            WithValidator(v.Range(1, 100)),

        ziva.NewInputTask("Alfasayısal", "Sadece harf ve rakam:").
            WithValidator(v.AlphaNumeric()),

        ziva.NewInputTask("Parola", "En az 8 karakter:").
            WithInputType(ziva.InputTypePassword).
            WithValidator(v.StandardPassword()),

        ziva.NewInputTask("Güçlü parola", "En az 12 karakter, karışık set:").
            WithInputType(ziva.InputTypePassword).
            WithValidator(v.StrongPassword()),
    }

    queue := ziva.NewQueue("Doğrulama turu").
        WithTasksNumbered(true, "[%02d]")
    queue.AddTasks(tasks...)
    _ = queue.Run()
}
Her görev, kullanıcı Enter’a bastığında doğrulayıcıyı tetikler. Doğrulama başarısız olursa TUI hatayı gösterir ve değer koşulları sağlayana kadar görev odakta kalır.

Özel doğrulama zinciri

type Chain struct {
    validators []ziva.Validator
}

func (c Chain) Validate(input string) error {
    for _, validator := range c.validators {
        if err := validator.Validate(input); err != nil {
            return err
        }
    }
    return nil
}

func (c Chain) Description() string {
    parts := make([]string, len(c.validators))
    for i, validator := range c.validators {
        parts[i] = validator.Description()
    }
    return strings.Join(parts, "; ")
}

func AskSecureToken() {
    v := ziva.DefaultValidators

    token := ziva.NewInputTask(
        "API token",
        "Zorunlu, 16-64 karakter, alfasayısal",
    ).WithValidator(Chain{
        validators: []ziva.Validator{
            v.Required(),
            v.MinLength(16),
            v.MaxLength(64),
            v.AlphaNumeric(),
        },
    })

    queue := ziva.NewQueue("Token doğrulama")
    queue.AddTasks(token)
    _ = queue.Run()

    fmt.Println("Token kabul edildi:", token.GetValue())
}

Harici doğrulayıcı örneği

func emailNotInCRM(email string) bool {
    // Gerçek API çağrısı ile değiştirin.
    return !strings.HasSuffix(email, "@banned.example")
}

type UniqueEmail struct{}

func (UniqueEmail) Validate(input string) error {
    if !emailNotInCRM(input) {
        return errors.New("email zaten kayıtlı")
    }
    return nil
}

func (UniqueEmail) Description() string {
    return "Email CRM'de benzersiz olmalı"
}

func SignUpForm() error {
    v := ziva.DefaultValidators

    email := ziva.NewInputTask("Email", "Çalışma e-postası girin:").
        WithInputType(ziva.InputTypeEmail).
        WithValidator(v.Email())

    password := ziva.NewInputTask(
        "Parola",
        "En az 12 karakter, harf/rakam/sembol",
    ).WithInputType(ziva.InputTypePassword).
        WithValidator(v.StrongPassword())

    confirm := ziva.NewYesNoTask(
        "Onay",
        "Verileri CRM'e gönder?")
    confirm.WithDefaultYes()

    queue := ziva.NewQueue("Kullanıcı kaydı")
    queue.AddTasks(email, password, confirm)
    if err := queue.Run(); err != nil {
        return err
    }

    check := ziva.NewInputTask("Benzersizlik kontrolü", "Email benzersiz olmalı:").
        WithInputType(ziva.InputTypeEmail).
        WithValidator(UniqueEmail{})

    followUp := ziva.NewQueue("CRM kontrolü")
    followUp.AddTasks(check)
    return followUp.Run()
}
Girdi topladıktan sonra harici bir servisi çağırmanız gerekiyorsa FuncTask kullanın ve sonucu (başarı, uyarı, yeniden dene vb.) TUI içinde gösterin.

Hızlı ipuçları

  • Description() değerini kullanıcı dostu tutun — Ziva bu metni giriş alanının yanında gösterir.
  • Boş değerleri kabul eden doğrulayıcılarla WithAllowEmpty(true) kombinasyonunu kullanın.
  • Uzun formları birkaç kuyruğa bölün; yanlış alanlara geri dönmek daha kolay olur.
  • Karmaşık doğrulayıcılar için birim testleri yazın — sonuçta bunlar sıradan Go kodu.
Bu yapı taşlarının projelerde nasıl birleştiğini görmek için en iyi uygulamalar sayfasına göz atın.
I