Format Rules
Learn how to validate common string formats in NLG Form, including URLs, IP addresses, UUIDs, JSON strings, and IANA timezones.
Format rules validate typed string fields defined with form.Str.
They are useful when a string must follow a specific external format such as an HTTP URL, IP address, UUID, JSON value, or IANA timezone name.
Common Use Cases
Format rules are commonly used for:
- website URLs
- callback URLs
- IP allowlists
- UUID identifiers
- JSON configuration strings
- timezone preferences
- API payload validation
- integration settings
- user profile settings
- system configuration forms
TL;DR
| Rule | Description |
|---|---|
rules.URL(field) | Requires the string to be a valid http:// or https:// URL |
rules.URLWithCode(field, code) | Same as URL with a custom error code |
rules.IP(field) | Requires the string to be a valid IP address |
rules.IPWithCode(field, code) | Same as IP with a custom error code |
rules.UUID(field) | Requires the string to be a valid UUID |
rules.UUIDWithCode(field, code) | Same as UUID with a custom error code |
rules.JSON(field) | Requires the string to contain valid JSON |
rules.JSONWithCode(field, code) | Same as JSON with a custom error code |
rules.Timezone(field) | Requires the string to be a valid IANA timezone |
rules.TimezoneWithCode(field, code) | Same as Timezone with a custom error code |
Defining Format Fields
Format validation starts with typed string fields.
FormatForm := struct {
Website form.StringField[FormatRulesRequest]
ClientIP form.StringField[FormatRulesRequest]
UserID form.StringField[FormatRulesRequest]
Config form.StringField[FormatRulesRequest]
Timezone form.StringField[FormatRulesRequest]
}{
Website: form.Str[FormatRulesRequest]("website", func(r *FormatRulesRequest) string {
return r.Website
}),
ClientIP: form.Str[FormatRulesRequest]("client_ip", func(r *FormatRulesRequest) string {
return r.ClientIP
}),
UserID: form.Str[FormatRulesRequest]("user_id", func(r *FormatRulesRequest) string {
return r.UserID
}),
Config: form.Str[FormatRulesRequest]("config", func(r *FormatRulesRequest) string {
return r.Config
}),
Timezone: form.Str[FormatRulesRequest]("timezone", func(r *FormatRulesRequest) string {
return r.Timezone
}),
}Applying Format Rules
Format rules are attached directly to typed string field references.
return form.Schema[FormatRulesRequest]{
rules.URL(FormatForm.Website),
rules.IP(FormatForm.ClientIP),
rules.UUID(FormatForm.UserID),
rules.JSON(FormatForm.Config),
rules.Timezone(FormatForm.Timezone),
}Rule Examples
URL
Requires the string to be a valid HTTP or HTTPS URL.
rules.URL(FormatForm.Website)Valid examples:
https://example.com
http://localhost:8080URLWithCode
const CodeInvalidURL = form.Code("invalid_url")
rules.URLWithCode(
FormatForm.Website,
CodeInvalidURL,
)IP
Requires the string to be a valid IP address.
rules.IP(FormatForm.ClientIP)Valid examples:
127.0.0.1
192.168.1.10
::1IPWithCode
const CodeInvalidIP = form.Code("invalid_ip")
rules.IPWithCode(
FormatForm.ClientIP,
CodeInvalidIP,
)UUID
Requires the string to be a valid UUID.
rules.UUID(FormatForm.UserID)Valid example:
550e8400-e29b-41d4-a716-446655440000UUIDWithCode
const CodeInvalidUUID = form.Code("invalid_uuid")
rules.UUIDWithCode(
FormatForm.UserID,
CodeInvalidUUID,
)JSON
Requires the string to contain valid JSON.
rules.JSON(FormatForm.Config)Valid examples:
{"enabled":true}["api", "admin"]JSONWithCode
const CodeInvalidJSON = form.Code("invalid_json")
rules.JSONWithCode(
FormatForm.Config,
CodeInvalidJSON,
)Timezone
Requires the string to be a valid IANA timezone name.
rules.Timezone(FormatForm.Timezone)Valid examples:
Europe/Bratislava
UTC
America/New_YorkTimezoneWithCode
const CodeInvalidTimezone = form.Code("invalid_timezone")
rules.TimezoneWithCode(
FormatForm.Timezone,
CodeInvalidTimezone,
)Complete Example
package main
import (
"github.com/netlifeguru/form"
"github.com/netlifeguru/form/rules"
)
type FormatRulesRequest struct {
Website string `json:"website"`
ClientIP string `json:"client_ip"`
UserID string `json:"user_id"`
Config string `json:"config"`
Timezone string `json:"timezone"`
}
func FormatRulesSchema() form.Schema[FormatRulesRequest] {
FormatForm := struct {
Website form.StringField[FormatRulesRequest]
ClientIP form.StringField[FormatRulesRequest]
UserID form.StringField[FormatRulesRequest]
Config form.StringField[FormatRulesRequest]
Timezone form.StringField[FormatRulesRequest]
}{
Website: form.Str[FormatRulesRequest]("website", func(r *FormatRulesRequest) string {
return r.Website
}),
ClientIP: form.Str[FormatRulesRequest]("client_ip", func(r *FormatRulesRequest) string {
return r.ClientIP
}),
UserID: form.Str[FormatRulesRequest]("user_id", func(r *FormatRulesRequest) string {
return r.UserID
}),
Config: form.Str[FormatRulesRequest]("config", func(r *FormatRulesRequest) string {
return r.Config
}),
Timezone: form.Str[FormatRulesRequest]("timezone", func(r *FormatRulesRequest) string {
return r.Timezone
}),
}
return form.Schema[FormatRulesRequest]{
rules.URL(FormatForm.Website),
rules.IP(FormatForm.ClientIP),
rules.UUID(FormatForm.UserID),
rules.JSON(FormatForm.Config),
rules.Timezone(FormatForm.Timezone),
}
}Notes
- Format rules operate on typed Go
stringvalues. - Empty strings are ignored unless the field is also marked as required.
- Use
rules.Required(field)together with format rules when the value must be present. URLacceptshttp://andhttps://URLs.IPsupports both IPv4 and IPv6 values.Timezonevalidates IANA timezone names through Go’stime.LoadLocation.- Custom error codes are recommended for public API responses and frontend integrations.
- Format validation remains explicit, reusable, and independent from HTTP or JSON transport layers.
Slice Rules
Learn how to validate slice and array fields in NLG Form using length validation, emptiness checks, containment rules, uniqueness validation, and custom error codes.
Generic Rules
Learn how to validate generic comparable values in NLG Form using reusable allowed-value rules for strings, integers, booleans, enums, statuses, plans, and custom validation codes.