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.