Skip to main content
Version: 2.0.1

Constraints Overview

Constraints are validation rules applied to struct fields via struct tags. Pedantigo provides a comprehensive set of built-in constraints covering everything from basic requirements to complex format validation.

Constraint Syntax

Constraints are specified using the validate struct tag. Multiple constraints can be combined with commas, and some accept parameters:

type User struct {
// Basic constraint
Name string `json:"name" validate:"required"`

// Multiple constraints
Email string `json:"email" validate:"required,email"`

// Constraints with parameters
Age int `json:"age" validate:"required,min=18,max=120"`
Username string `json:"username" validate:"minLength=3,maxLength=20,pattern=^[a-z0-9_]+$"`
}

Constraint Categories

Core Constraints

The fundamental constraints applicable across multiple types:

ConstraintParameterDescriptionExample
requiredNoneField must be present in the inputvalidate:"required"
omitemptyNoneSkip regular constraints when the field is at its zero value; cross-field constraints still runvalidate:"omitempty,email"
minNumericMinimum value (numeric) or length (string)validate:"min=18"
maxNumericMaximum value (numeric) or length (string)validate:"max=100"
gtNumericGreater thanvalidate:"gt=0"
gteNumericGreater than or equalvalidate:"gte=1"
ltNumericLess thanvalidate:"lt=100"
lteNumericLess than or equalvalidate:"lte=99"
eqValueMust equal exact valuevalidate:"eq=active"
neValueMust NOT equal valuevalidate:"ne=banned"
oneofSpace-separated valuesMust be one of specified valuesvalidate:"oneof=red green blue"
oneofciSpace-separated valuesCase-insensitive oneofvalidate:"oneofci=admin user guest"
lenNumericExact length (strings/arrays)validate:"len=32"

See the Numeric Constraints page for detailed numeric range examples. See omitempty as a Validation Constraint for the full omitempty reference including cross-field interaction.

String Constraints

Specialized constraints for string validation:

ConstraintParameterDescriptionExample
minLengthNumericMinimum string lengthvalidate:"minLength=3"
maxLengthNumericMaximum string lengthvalidate:"maxLength=100"
alphaNoneOnly alphabetic charactersvalidate:"alpha"
alphanumNoneOnly letters and numbersvalidate:"alphanum"
asciiNoneOnly ASCII charactersvalidate:"ascii"
lowercaseNoneMust be lowercasevalidate:"lowercase"
uppercaseNoneMust be uppercasevalidate:"uppercase"
containsStringMust contain substringvalidate:"contains=test"
excludesStringMust not contain substringvalidate:"excludes=forbidden"
startswithStringMust start with prefixvalidate:"startswith=https://"
endswithStringMust end with suffixvalidate:"endswith=.com"
strip_whitespaceNoneNo leading/trailing whitespacevalidate:"strip_whitespace"
patternRegexMatch regex patternvalidate:"pattern=^[a-z]+$"
regexpRegexMatch regex pattern (alias)validate:"regexp=^[a-z]+$"

See the String Constraints page for detailed string validation examples.

Numeric Constraints

Additional constraints specific to numeric types:

ConstraintParameterDescriptionExample
positiveNoneMust be greater than zerovalidate:"positive"
negativeNoneMust be less than zerovalidate:"negative"
multiple_ofNumericMust be divisible by valuevalidate:"multiple_of=5"
max_digitsNumericMaximum total digitsvalidate:"max_digits=8"
decimal_placesNumericMaximum decimal placesvalidate:"decimal_places=2"
disallow_inf_nanNoneReject infinity and NaN valuesvalidate:"disallow_inf_nan"

See the Numeric Constraints page for detailed numeric validation examples.

Format Constraints

Constraints for common data formats:

ConstraintDescriptionExample
emailValid email address formatvalidate:"email"
urlValid URL formatvalidate:"url"
uriValid URI formatvalidate:"uri"
uuidValid UUID (any version)validate:"uuid"
ipv4Valid IPv4 addressvalidate:"ipv4"
ipv6Valid IPv6 addressvalidate:"ipv6"
ipValid IPv4 or IPv6 addressvalidate:"ip"
cidrValid CIDR notation (IPv4 or IPv6)validate:"cidr"
cidrv4Valid IPv4 CIDR notationvalidate:"cidrv4"
cidrv6Valid IPv6 CIDR notationvalidate:"cidrv6"
macValid MAC addressvalidate:"mac"
hostnameValid hostnamevalidate:"hostname"
hostname_rfc1123Valid RFC 1123 hostnamevalidate:"hostname_rfc1123"
fqdnValid fully qualified domain namevalidate:"fqdn"
portValid port number (0-65535)validate:"port"
tcp_addrValid TCP addressvalidate:"tcp_addr"
udp_addrValid UDP addressvalidate:"udp_addr"
tcp4_addrValid TCP4 addressvalidate:"tcp4_addr"
jsonValid JSON stringvalidate:"json"
jwtValid JSON Web Tokenvalidate:"jwt"
semverValid semantic versionvalidate:"semver"
cronValid cron expressionvalidate:"cron"
datetimeMatches Go time layoutvalidate:"datetime=2006-01-02"
ulidValid ULID formatvalidate:"ulid"

See the Format Constraints page for detailed format validation examples.

Encoding Constraints

Constraints for encoded data formats:

ConstraintDescriptionExample
base64Valid base64 encodingvalidate:"base64"
base64urlValid URL-safe base64 encodingvalidate:"base64url"
base64rawurlValid raw URL-safe base64 encodingvalidate:"base64rawurl"

Hash Constraints

Constraints for validating hash format strings:

ConstraintDescriptionExample
md5Valid MD5 hash formatvalidate:"md5"
sha256Valid SHA256 hash formatvalidate:"sha256"
sha384Valid SHA384 hash formatvalidate:"sha384"
sha512Valid SHA512 hash formatvalidate:"sha512"
mongodbValid MongoDB ObjectID formatvalidate:"mongodb"

Finance Constraints

Constraints for financial and cryptocurrency identifiers:

ConstraintDescriptionExample
credit_cardValid credit card number (Luhn check)validate:"credit_card"
luhn_checksumValid Luhn checksumvalidate:"luhn_checksum"
btc_addrValid Bitcoin address (P2PKH/P2SH)validate:"btc_addr"
btc_addr_bech32Valid Bitcoin bech32 addressvalidate:"btc_addr_bech32"
eth_addrValid Ethereum addressvalidate:"eth_addr"

Identity Constraints

Constraints for identification numbers and codes:

ConstraintDescriptionExample
isbnValid ISBN (10 or 13)validate:"isbn"
isbn10Valid ISBN-10validate:"isbn10"
isbn13Valid ISBN-13validate:"isbn13"
issnValid ISSN formatvalidate:"issn"
ssnValid US Social Security Numbervalidate:"ssn"
einValid US Employer Identification Numbervalidate:"ein"
e164Valid E.164 phone number formatvalidate:"e164"

Geographic Constraints

Constraints for geographic coordinates:

ConstraintDescriptionExample
latitudeValid latitude (-90 to 90)validate:"latitude"
longitudeValid longitude (-180 to 180)validate:"longitude"

Color Constraints

Constraints for color format validation:

ConstraintDescriptionExample
hexcolorValid hex color (#RGB or #RRGGBB)validate:"hexcolor"
rgbValid RGB colorvalidate:"rgb"
rgbaValid RGBA colorvalidate:"rgba"
hslValid HSL colorvalidate:"hsl"
hslaValid HSLA colorvalidate:"hsla"

ISO Constraints

Constraints for ISO standard codes and formats:

ConstraintParameterDescriptionExample
iso3166_alpha2NoneISO 3166-1 alpha-2 country codevalidate:"iso3166_alpha2"
iso3166_alpha2_euNoneISO 3166-1 alpha-2 EU country codevalidate:"iso3166_alpha2_eu"
iso3166_alpha3NoneISO 3166-1 alpha-3 country codevalidate:"iso3166_alpha3"
iso3166_alpha3_euNoneISO 3166-1 alpha-3 EU country codevalidate:"iso3166_alpha3_eu"
iso3166_numericNoneISO 3166-1 numeric country codevalidate:"iso3166_numeric"
iso3166_2NoneISO 3166-2 subdivision codevalidate:"iso3166_2"
iso4217NoneISO 4217 currency codevalidate:"iso4217"
iso4217_numericNoneISO 4217 numeric currency codevalidate:"iso4217_numeric"
postcodeCountry codePostal code for specific countryvalidate:"postcode=US"
postcode_iso3166_alpha2Country codePostal code (alias for postcode)validate:"postcode_iso3166_alpha2=GB"
bcp47NoneBCP 47 language tagvalidate:"bcp47"

Filesystem Constraints

Constraints for file and directory path validation:

ConstraintDescriptionExample
filepathValid file pathvalidate:"filepath"
dirpathValid directory pathvalidate:"dirpath"
filePath must point to existing filevalidate:"file"
dirPath must point to existing directoryvalidate:"dir"

Collection Constraints

Constraints for arrays, slices, and maps:

ConstraintParameterDescriptionExample
minItemsNumericMinimum number of itemsvalidate:"minItems=1"
maxItemsNumericMaximum number of itemsvalidate:"maxItems=100"
uniqueNoneAll items must be uniquevalidate:"unique"

See the Collection Constraints page for detailed collection validation examples.

Default Values

ConstraintParameterDescriptionExample
defaultValueDefault value if field missingvalidate:"default=active"

For slice fields, use space-separated values (consistent with oneof syntax):

Scopes []string `json:"scopes" validate:"default=read write"`
Tags []string `json:"tags" validate:"default=general"`

Complete Example

Here's a realistic example combining constraints from multiple categories:

package main

import (
"log"
"github.com/SmrutAI/pedantigo/v2/validator"
)

type UserProfile struct {
// Core constraints
ID string `json:"id" validate:"required,uuid"`
Email string `json:"email" validate:"required,email"`
Username string `json:"username" validate:"required,minLength=3,maxLength=20,alphanum"`

// String constraints
Bio string `json:"bio,omitempty" validate:"maxLength=500"`
Website string `json:"website,omitempty" validate:"url"`

// Numeric constraints
Age int `json:"age" validate:"min=13,max=120"`
Rating float64 `json:"rating,omitempty" validate:"min=0,max=5,decimal_places=1"`

// Geographic constraints
Latitude float64 `json:"latitude,omitempty" validate:"latitude"`
Longitude float64 `json:"longitude,omitempty" validate:"longitude"`

// ISO constraints
Country string `json:"country,omitempty" validate:"iso3166_alpha2"`
Currency string `json:"currency,omitempty" validate:"iso4217"`

// Collection constraints
Tags []string `json:"tags,omitempty" validate:"maxItems=10,unique"`
Roles []string `json:"roles" validate:"minItems=1,oneof=admin moderator user"`

// Enum constraint
Status string `json:"status" validate:"required,oneof=active inactive suspended"`
}

func main() {
jsonData := []byte(`{
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "alice@example.com",
"username": "alice123",
"bio": "Software engineer and open source enthusiast",
"website": "https://example.com",
"age": 28,
"rating": 4.5,
"latitude": 40.7128,
"longitude": -74.0060,
"country": "US",
"currency": "USD",
"tags": ["golang", "rust", "web"],
"roles": ["user"],
"status": "active"
}`)

user, err := validator.Unmarshal[UserProfile](jsonData)
if err != nil {
log.Fatalf("Validation failed: %v", err)
}

// user is now a fully validated UserProfile
log.Printf("User: %+v", user)
}

Validation Error Handling

When validation fails, Pedantigo returns detailed errors for each field:

user, err := validator.Unmarshal[UserProfile](invalidData)
if err != nil {
if validationErr, ok := err.(*validator.ValidationError); ok {
for _, fieldErr := range validationErr.Errors {
fmt.Printf("Field: %s, Error: %s\n", fieldErr.Field, fieldErr.Message)
}
}
}

Example validation error output:

Field: email, Error: must be a valid email address
Field: age, Error: must be at least 13
Field: rating, Error: must be at most 5
Field: roles, Error: field is required

Context-Aware Constraints

Some constraints behave differently depending on the field type:

  • min/max: For numeric types, validates value range. For strings, validates length. For arrays, validates item count.
  • gt/gte/lt/lte: Works with numeric types and comparable values.
  • len: For strings, validates character count. For arrays/slices, validates element count.

Performance Considerations

Constraint validation in Pedantigo is highly optimized:

  • Format constraints (email, URL, UUID, etc.) use compiled regex patterns cached at startup
  • ISO code validation uses precompiled lookup tables
  • Numeric constraints perform simple arithmetic comparisons
  • String constraints use efficient string operations

See Schema Generation for caching strategy that provides 240x speedup.

Next Steps

Learn more about specific constraint categories: