Skip to content

Validation-Heavy APIs

Use declarative validation first. Keep hand-written field checks for rules that actually need application logic.

type InviteUserRequest struct {
Email string `json:"email" validate:"required,email"`
Role string `json:"role" validate:"required,oneof=admin|editor|viewer"`
Name string `json:"name" validate:"required,min=2,max=120"`
}

Use custom request validation for cross-field invariants:

func (req InviteUserRequest) Validate(ctx sdk.Ctx) error {
if req.Role == "admin" && !strings.HasSuffix(req.Email, "@company.com") {
return ctx.Errors().Validation().
Field("email", "admin invites require a company address").
Err()
}
return nil
}

The compiler rejects malformed validation tags and unsupported fields before the app runs.