Skip to main content
Version: 2.0.0

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: