Documentation
¶
Overview ¶
Optional types may be either empty (null) or contain a value that must pass validation.
Optional types support the following encoding/decoding formats:
- json
- sql
- text
Index ¶
- type Any
- type Base64
- type CIDR
- type Charset
- type CountryAlpha
- type CountryAlpha2
- type CountryAlpha3
- type CurrencyAlpha
- type Custom
- func (c Custom[T, V]) Get() (T, bool)
- func (c Custom[T, V]) GetPtr() *T
- func (c Custom[T, V]) HasValue() bool
- func (c Custom[T, V]) MarshalJSON() ([]byte, error)
- func (c Custom[T, V]) MarshalText() ([]byte, error)
- func (c Custom[T, V]) Must() T
- func (c *Custom[T, V]) MustParse(value any)
- func (c *Custom[T, V]) Parse(value any) error
- func (c *Custom[T, V]) Scan(src any) error
- func (c *Custom[T, V]) TypeValidate() error
- func (c *Custom[T, V]) UnmarshalJSON(data []byte) error
- func (c *Custom[T, V]) UnmarshalText(data []byte) error
- func (c Custom[T, V]) Value() (driver.Value, error)
- type Email
- type Even
- type HTTPURL
- type IP
- type IPV4
- type IPV6
- type InFuture
- type InPast
- type JSON
- type LangAlpha
- type LangAlpha2
- type LangAlpha3
- type Latitude
- type Longitude
- type MAC
- type MIME
- type Negative
- type Negative0
- type NonEmpty
- type NonEmptySlice
- type NonZero
- type NonZeroCharset
- type Odd
- type Positive
- type Positive0
- type URL
- type UUID
- type Unique
- type UniqueSlice
Examples ¶
- Any
- Base64
- CIDR
- Charset
- CountryAlpha
- CountryAlpha2
- CountryAlpha3
- CurrencyAlpha
- Custom
- Even
- HTTPURL
- IP
- IPV4
- IPV6
- InFuture
- InPast
- JSON
- LangAlpha
- LangAlpha2
- LangAlpha3
- Latitude
- Longitude
- MAC
- MIME
- Negative
- Negative0
- NonEmpty
- NonEmptySlice
- NonZero
- NonZeroCharset
- Odd
- Positive
- Positive0
- URL
- UUID
- Unique
- UniqueSlice
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Any ¶
Any accepts any value of T
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.Any[string] // Parse a value value.MustParse("any value is acceptable") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty string is also valid value.MustParse("") val, exists = value.Get() fmt.Printf("Empty string value: %q, Exists: %t\n", val, exists) // Parse nil for an empty optional value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // GetPtr returns nil for empty optionals value.MustParse(nil) ptr := value.GetPtr() fmt.Printf("GetPtr returns nil: %t\n", ptr == nil) }
Output: Value: any value is acceptable, Exists: true Empty string value: "", Exists: true After nil: Exists: false GetPtr returns nil: true
type Base64 ¶
type Base64[T constraint.Text] struct { Custom[T, validate.Base64[T]] }
Base64 accepts valid base64 encoded strings
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.Base64[string] // Valid base64 value.MustParse("SGVsbG8gV29ybGQ=") // "Hello World" _, exists := value.Get() fmt.Printf("Value exists: %t\n", exists) // Empty optional is valid value.MustParse(nil) _, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid base64 will fail validation var invalidValue optional.Base64[string] err := invalidValue.Parse("not!valid!base64!") fmt.Printf("Invalid base64 error: %t\n", err != nil) }
Output: Value exists: true After nil: Exists: false Invalid base64 error: true
type CIDR ¶
type CIDR[T constraint.Text] struct { Custom[T, validate.CIDR[T]] }
CIDR accepts CIDR notation IP address and prefix length, like "192.0.2.0/24" or "2001:db8::/32", as defined in RFC 4632 and RFC 4291
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.CIDR[string] // Valid CIDR value.MustParse("192.168.1.0/24") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid CIDRs will fail validation var invalidValue optional.CIDR[string] err := invalidValue.Parse("192.168.1.1") // missing prefix fmt.Printf("Missing prefix error: %t\n", err != nil) }
Output: Value: 192.168.1.0/24, Exists: true After nil: Exists: false Missing prefix error: true
type Charset ¶
Charset accepts text which contains only runes acceptable by filter
NOTE: empty strings will also pass. Use NonZeroCharset if you need non-empty strings
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" "github.com/metafates/schema/validate/charset" ) func main() { // Charset allows empty strings var value optional.Charset[string, charset.Letter] value.MustParse("abcDEF") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty strings are allowed value.MustParse("") val, exists = value.Get() fmt.Printf("Empty string: %q, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Non-alphabetic characters will fail validation var invalidValue optional.Charset[string, charset.Letter] err := invalidValue.Parse("abc123") fmt.Printf("Non-alphabetic error: %t\n", err != nil) }
Output: Value: abcDEF, Exists: true Empty string: "", Exists: true After nil: Exists: false Non-alphabetic error: true
type CountryAlpha ¶
type CountryAlpha[T constraint.Text] struct { Custom[T, validate.CountryAlpha[T]] }
CountryAlpha accepts either CountryAlpha2 or CountryAlpha3
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.CountryAlpha[string] // Accepts both 2-letter codes value.MustParse("US") val, exists := value.Get() fmt.Printf("2-letter: %s, Exists: %t\n", val, exists) // And 3-letter codes value.MustParse("GBR") val, exists = value.Get() fmt.Printf("3-letter: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid country codes will fail validation var invalidValue optional.CountryAlpha[string] err := invalidValue.Parse("USAX") // too long fmt.Printf("Too long code error: %t\n", err != nil) }
Output: 2-letter: US, Exists: true 3-letter: GBR, Exists: true After nil: Exists: false Too long code error: true
type CountryAlpha2 ¶
type CountryAlpha2[T constraint.Text] struct { Custom[T, validate.CountryAlpha2[T]] }
CountryAlpha2 accepts case-insensitive ISO 3166 2-letter country code
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.CountryAlpha2[string] // Valid country code value.MustParse("US") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Case-insensitive value.MustParse("gb") val, exists = value.Get() fmt.Printf("Case-insensitive: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid country codes will fail validation var invalidValue optional.CountryAlpha2[string] err := invalidValue.Parse("USA") // too long fmt.Printf("Three-letter code error: %t\n", err != nil) }
Output: Value: US, Exists: true Case-insensitive: gb, Exists: true After nil: Exists: false Three-letter code error: true
type CountryAlpha3 ¶
type CountryAlpha3[T constraint.Text] struct { Custom[T, validate.CountryAlpha3[T]] }
CountryAlpha3 accepts case-insensitive ISO 3166 3-letter country code
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.CountryAlpha3[string] // Valid country code value.MustParse("USA") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid country codes will fail validation var invalidValue optional.CountryAlpha3[string] err := invalidValue.Parse("US") // too short fmt.Printf("Two-letter code error: %t\n", err != nil) }
Output: Value: USA, Exists: true After nil: Exists: false Two-letter code error: true
type CurrencyAlpha ¶
type CurrencyAlpha[T constraint.Text] struct { Custom[T, validate.CurrencyAlpha[T]] }
CurrencyAlpha accepts case-insensitive ISO 4217 alphabetic currency code
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.CurrencyAlpha[string] // Valid currency code value.MustParse("USD") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid currency codes will fail validation var invalidValue optional.CurrencyAlpha[string] err := invalidValue.Parse("US") // too short fmt.Printf("Too short code error: %t\n", err != nil) }
Output: Value: USD, Exists: true After nil: Exists: false Too short code error: true
type Custom ¶
Custom optional type. When given non-null value it errors if validation fails
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" "github.com/metafates/schema/validate" ) func main() { // Custom allows creating an optional type with any validator var value optional.Custom[int, validate.Positive[int]] value.MustParse(42) val, exists := value.Get() fmt.Printf("Value: %d, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid values will fail validation var invalidValue optional.Custom[int, validate.Positive[int]] err := invalidValue.Parse(-5) fmt.Printf("Invalid value error: %t\n", err != nil) }
Output: Value: 42, Exists: true After nil: Exists: false Invalid value error: true
func (Custom[T, V]) Get ¶
Get returns the contained value and a boolean stating its presence. True if value exists, false otherwise.
Panics if value was not validated yet. See also Custom.GetPtr
func (Custom[T, V]) GetPtr ¶
func (c Custom[T, V]) GetPtr() *T
Get returns the pointer to the contained value. Non-nil if value exists, nil otherwise. Pointed value is a shallow copy.
Panics if value was not validated yet. See also Custom.Get
func (Custom[T, V]) MarshalJSON ¶
MarshalJSON implements the json.Marshaler interface.
func (Custom[T, V]) MarshalText ¶
MarshalText implements the encoding.TextMarshaler interface
func (Custom[T, V]) Must ¶
func (c Custom[T, V]) Must() T
Must returns the contained value and panics if it does not have one. You can check for its presence using Custom.HasValue or use a more safe alternative Custom.Get
func (*Custom[T, V]) Parse ¶
Parse checks if given value is valid. If it is, a value is used to initialize this type. Value is converted to the target type T, if possible. If not - parse.UnconvertableTypeError is returned. It is allowed to pass convertable type wrapped in optional type.
Parsed type is validated, therefore it is safe to call Custom.Get afterwards.
Passing nil results a valid empty instance.
func (*Custom[T, V]) Scan ¶
Scan implements the sql.Scanner interface.
Use Custom.Parse instead if you need to construct this value manually
func (*Custom[T, V]) TypeValidate ¶
TypeValidate implements the validate.TypeValidateable interface. You should not call this function directly.
func (*Custom[T, V]) UnmarshalJSON ¶
UnmarshalJSON implements the json.Unmarshaler interface.
func (*Custom[T, V]) UnmarshalText ¶
UnmarshalText implements the encoding.TextUnmarshaler interface
func (Custom[T, V]) Value ¶
Value implements the driver.Valuer interface.
Use Custom.Get method instead for getting the go value
type Email ¶
type Email[T constraint.Text] struct { Custom[T, validate.Email[T]] }
Email accepts a single RFC 5322 address, e.g. "Barry Gibbs <bg@example.com>"
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.Email[string] // Valid email value.MustParse("user@example.com") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid emails will fail validation var invalidValue optional.Email[string] err := invalidValue.Parse("not-an-email") fmt.Printf("Invalid email error: %t\n", err != nil) // Using GetPtr() value.MustParse("user@example.com") ptr := value.GetPtr() fmt.Printf("GetPtr value: %s, IsNil: %t\n", *ptr, ptr == nil) }
Output: Value: user@example.com, Exists: true After nil: Exists: false Invalid email error: true GetPtr value: user@example.com, IsNil: false
type Even ¶
type Even[T constraint.Integer] struct { Custom[T, validate.Even[T]] }
Even accepts real numbers divisible by two
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.Even[int] // Valid even value value.MustParse(42) val, exists := value.Get() fmt.Printf("Value: %d, Exists: %t\n", val, exists) // Zero is even value.MustParse(0) val, exists = value.Get() fmt.Printf("Zero value: %d, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Odd numbers will fail validation var invalidValue optional.Even[int] err := invalidValue.Parse(3) fmt.Printf("Odd number error: %t\n", err != nil) }
Output: Value: 42, Exists: true Zero value: 0, Exists: true After nil: Exists: false Odd number error: true
type HTTPURL ¶
type HTTPURL[T constraint.Text] struct { Custom[T, validate.HTTPURL[T]] }
HTTPURL accepts a single http(s) url.
See also URL
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.HTTPURL[string] // Valid HTTP URL value.MustParse("https://example.com") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Non-HTTP URLs will fail validation var invalidValue optional.HTTPURL[string] err := invalidValue.Parse("ftp://example.com") fmt.Printf("Non-HTTP URL error: %t\n", err != nil) // Relative URLs will fail validation err = invalidValue.Parse("/relative/path") fmt.Printf("Relative URL error: %t\n", err != nil) }
Output: Value: https://example.com, Exists: true After nil: Exists: false Non-HTTP URL error: true Relative URL error: true
type IP ¶
type IP[T constraint.Text] struct { Custom[T, validate.IP[T]] }
IP accepts an IP address. The address can be in dotted decimal ("192.0.2.1"), IPv6 ("2001:db8::68"), or IPv6 with a scoped addressing zone ("fe80::1cc0:3e8c:119f:c2e1%ens18").
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.IP[string] // Valid IPv4 value.MustParse("192.168.1.1") val, exists := value.Get() fmt.Printf("IPv4: %s, Exists: %t\n", val, exists) // Valid IPv6 value.MustParse("2001:0db8:85a3:0000:0000:8a2e:0370:7334") val, exists = value.Get() fmt.Printf("Has IPv6: %t\n", exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid IPs will fail validation var invalidValue optional.IP[string] err := invalidValue.Parse("999.999.999.999") fmt.Printf("Invalid IP error: %t\n", err != nil) }
Output: IPv4: 192.168.1.1, Exists: true Has IPv6: true After nil: Exists: false Invalid IP error: true
type IPV4 ¶
type IPV4[T constraint.Text] struct { Custom[T, validate.IPV4[T]] }
IP accepts an IP V4 address (e.g. "192.0.2.1").
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.IPV4[string] // Valid IPv4 value.MustParse("192.168.1.1") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // IPv6 addresses will fail validation var invalidValue optional.IPV4[string] err := invalidValue.Parse("2001:0db8:85a3:0000:0000:8a2e:0370:7334") fmt.Printf("IPv6 address error: %t\n", err != nil) }
Output: Value: 192.168.1.1, Exists: true After nil: Exists: false IPv6 address error: true
type IPV6 ¶
type IPV6[T constraint.Text] struct { Custom[T, validate.IPV6[T]] }
IP accepts an IP V6 address, including IPv4-mapped IPv6 addresses. The address can be regular IPv6 ("2001:db8::68"), or IPv6 with a scoped addressing zone ("fe80::1cc0:3e8c:119f:c2e1%ens18")
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.IPV6[string] // Valid IPv6 value.MustParse("2001:0db8:85a3:0000:0000:8a2e:0370:7334") _, exists := value.Get() fmt.Printf("Has value: %t\n", exists) // Empty optional is valid value.MustParse(nil) _, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // IPv4 addresses will fail validation var invalidValue optional.IPV6[string] err := invalidValue.Parse("192.168.1.1") fmt.Printf("IPv4 address error: %t\n", err != nil) }
Output: Has value: true After nil: Exists: false IPv4 address error: true
type InFuture ¶
type InFuture[T constraint.Time] struct { Custom[T, validate.InFuture[T]] }
InFuture accepts any time after current timestamp
See also InPast
Example ¶
package main import ( "fmt" "time" "github.com/metafates/schema/optional" ) func main() { var value optional.InFuture[time.Time] // Valid future time futureTime := time.Now().Add(24 * time.Hour) // 1 day in future value.MustParse(futureTime) val, exists := value.Get() fmt.Printf("Is in future: %t, Exists: %t\n", val.After(time.Now()), exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Past times will fail validation var invalidValue optional.InFuture[time.Time] pastTime := time.Now().Add(-24 * time.Hour) // 1 day ago err := invalidValue.Parse(pastTime) fmt.Printf("Past time error: %t\n", err != nil) }
Output: Is in future: true, Exists: true After nil: Exists: false Past time error: true
type InPast ¶
type InPast[T constraint.Time] struct { Custom[T, validate.InPast[T]] }
InPast accepts any time before current timestamp
See also InFuture
Example ¶
package main import ( "fmt" "time" "github.com/metafates/schema/optional" ) func main() { var value optional.InPast[time.Time] // Valid past time pastTime := time.Now().Add(-24 * time.Hour) // 1 day ago value.MustParse(pastTime) val, exists := value.Get() fmt.Printf("Is in past: %t, Exists: %t\n", val.Before(time.Now()), exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Future times will fail validation var invalidValue optional.InPast[time.Time] futureTime := time.Now().Add(24 * time.Hour) // 1 day in future err := invalidValue.Parse(futureTime) fmt.Printf("Future time error: %t\n", err != nil) }
Output: Is in past: true, Exists: true After nil: Exists: false Future time error: true
type JSON ¶
type JSON[T constraint.Text] struct { Custom[T, validate.JSON[T]] }
JSON accepts valid json encoded text
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.JSON[string] // Valid JSON value.MustParse(`{"name": "John", "age": 30}`) _, exists := value.Get() fmt.Printf("Has value: %t\n", exists) // Empty optional is valid value.MustParse(nil) _, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid JSON will fail validation var invalidValue optional.JSON[string] err := invalidValue.Parse(`{"name": "John", "age": }`) // missing value fmt.Printf("Invalid JSON error: %t\n", err != nil) }
Output: Has value: true After nil: Exists: false Invalid JSON error: true
type LangAlpha ¶
type LangAlpha[T constraint.Text] struct { Custom[T, validate.LangAlpha[T]] }
LangAlpha accepts either LangAlpha2 or LangAlpha3
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.LangAlpha[string] // Accepts both 2-letter codes value.MustParse("en") val, exists := value.Get() fmt.Printf("2-letter: %s, Exists: %t\n", val, exists) // And 3-letter codes value.MustParse("ger") val, exists = value.Get() fmt.Printf("3-letter: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid language codes will fail validation var invalidValue optional.LangAlpha[string] err := invalidValue.Parse("engx") // too long fmt.Printf("Too long code error: %t\n", err != nil) }
Output: 2-letter: en, Exists: true 3-letter: ger, Exists: true After nil: Exists: false Too long code error: true
type LangAlpha2 ¶
type LangAlpha2[T constraint.Text] struct { Custom[T, validate.LangAlpha2[T]] }
LangAlpha2 accepts case-insesitive ISO 639 2-letter language code.
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.LangAlpha2[string] // Valid language code value.MustParse("en") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid language codes will fail validation var invalidValue optional.LangAlpha2[string] err := invalidValue.Parse("eng") // too long fmt.Printf("Too long code error: %t\n", err != nil) }
Output: Value: en, Exists: true After nil: Exists: false Too long code error: true
type LangAlpha3 ¶
type LangAlpha3[T constraint.Text] struct { Custom[T, validate.LangAlpha3[T]] }
LangAlpha2 accepts case-insesitive ISO 639 3-letter language code.
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.LangAlpha3[string] // Valid language code value.MustParse("eng") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid language codes will fail validation var invalidValue optional.LangAlpha3[string] err := invalidValue.Parse("en") // too short fmt.Printf("Too short code error: %t\n", err != nil) }
Output: Value: eng, Exists: true After nil: Exists: false Too short code error: true
type Latitude ¶
type Latitude[T constraint.Real] struct { Custom[T, validate.Latitude[T]] }
Latitude accepts any number in the range [-90; 90]
See also Longitude
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.Latitude[float64] // Valid latitude value.MustParse(37.7749) // San Francisco val, exists := value.Get() fmt.Printf("Value: %.4f, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Out of range latitudes will fail validation var invalidValue optional.Latitude[float64] err := invalidValue.Parse(91) fmt.Printf("Too high error: %t\n", err != nil) }
Output: Value: 37.7749, Exists: true After nil: Exists: false Too high error: true
type Longitude ¶
type Longitude[T constraint.Real] struct { Custom[T, validate.Longitude[T]] }
Longitude accepts any number in the range [-180; 180]
See also Latitude
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.Longitude[float64] // Valid longitude value.MustParse(-122.4194) // San Francisco val, exists := value.Get() fmt.Printf("Value: %.4f, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Out of range longitudes will fail validation var invalidValue optional.Longitude[float64] err := invalidValue.Parse(181) fmt.Printf("Too high error: %t\n", err != nil) }
Output: Value: -122.4194, Exists: true After nil: Exists: false Too high error: true
type MAC ¶
type MAC[T constraint.Text] struct { Custom[T, validate.MAC[T]] }
MAC accepts an IEEE 802 MAC-48, EUI-48, EUI-64, or a 20-octet IP over InfiniBand link-layer address
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.MAC[string] // Valid MAC address value.MustParse("00:1B:44:11:3A:B7") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid MAC addresses will fail validation var invalidValue optional.MAC[string] err := invalidValue.Parse("not a mac address") fmt.Printf("Invalid MAC error: %t\n", err != nil) }
Output: Value: 00:1B:44:11:3A:B7, Exists: true After nil: Exists: false Invalid MAC error: true
type MIME ¶
type MIME[T constraint.Text] struct { Custom[T, validate.MIME[T]] }
MIME accepts RFC 1521 mime type string
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.MIME[string] // Valid MIME type value.MustParse("text/html") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid MIME types will fail validation var invalidValue optional.MIME[string] err := invalidValue.Parse("not a mime type") fmt.Printf("Invalid MIME type error: %t\n", err != nil) }
Output: Value: text/html, Exists: true After nil: Exists: false Invalid MIME type error: true
type Negative ¶
type Negative[T constraint.Real] struct { Custom[T, validate.Negative[T]] }
Negative accepts all negative real numbers and zero
See also Positive
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var intValue optional.Negative[int] // Valid negative value intValue.MustParse(-42) val, exists := intValue.Get() fmt.Printf("Value: %d, Exists: %t\n", val, exists) // Empty optional is valid intValue.MustParse(nil) val, exists = intValue.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Zero and positive values will fail validation var invalidValue optional.Negative[int] err := invalidValue.Parse(0) fmt.Printf("Zero error: %t\n", err != nil) err = invalidValue.Parse(5) fmt.Printf("Positive error: %t\n", err != nil) }
Output: Value: -42, Exists: true After nil: Exists: false Zero error: true Positive error: true
type Negative0 ¶
type Negative0[T constraint.Real] struct { Custom[T, validate.Negative0[T]] }
Negative0 accepts all negative real numbers including zero.
See Negative for zero excluding variant.
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var intValue optional.Negative0[int] // Valid negative value intValue.MustParse(-42) val, exists := intValue.Get() fmt.Printf("Value: %d, Exists: %t\n", val, exists) // Zero is valid for Negative0 intValue.MustParse(0) val, exists = intValue.Get() fmt.Printf("Zero value: %d, Exists: %t\n", val, exists) // Empty optional is valid intValue.MustParse(nil) val, exists = intValue.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Positive values will fail validation var invalidValue optional.Negative0[int] err := invalidValue.Parse(5) fmt.Printf("Positive error: %t\n", err != nil) }
Output: Value: -42, Exists: true Zero value: 0, Exists: true After nil: Exists: false Positive error: true
type NonEmpty ¶
NonEmpty accepts a non-empty slice-like (len > 0)
See NonEmptySlice for a slice shortcut
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { // NonEmpty with a slice type var value optional.NonEmpty[[]string, string] value.MustParse([]string{"hello", "world"}) val, exists := value.Get() fmt.Printf("Value: %v, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Empty slices will fail validation var invalidValue optional.NonEmpty[[]string, string] err := invalidValue.Parse([]string{}) fmt.Printf("Empty slice error: %t\n", err != nil) }
Output: Value: [hello world], Exists: true After nil: Exists: false Empty slice error: true
type NonEmptySlice ¶
type NonEmptySlice[T any] struct { Custom[[]T, validate.NonEmptySlice[T]] }
NonEmpty accepts a non-empty slice (len > 0)
See NonEmpty for a more generic version
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { // NonEmptySlice is a simplified version of NonEmpty var value optional.NonEmptySlice[int] value.MustParse([]int{1, 2, 3}) val, exists := value.Get() fmt.Printf("Value: %v, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Empty slices will fail validation var invalidValue optional.NonEmptySlice[int] err := invalidValue.Parse([]int{}) fmt.Printf("Empty slice error: %t\n", err != nil) }
Output: Value: [1 2 3], Exists: true After nil: Exists: false Empty slice error: true
type NonZero ¶
type NonZero[T comparable] struct { Custom[T, validate.NonZero[T]] }
NonZero accepts all non-zero values
The zero value is: - 0 for numeric types, - false for the boolean type, and - "" (the empty string) for strings.
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var strValue optional.NonZero[string] // Valid non-zero value strValue.MustParse("non-empty string") val, exists := strValue.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optionals are valid strValue.MustParse(nil) fmt.Printf("HasValue after nil: %t\n", strValue.HasValue()) // Empty strings will fail validation var invalidStr optional.NonZero[string] err := invalidStr.Parse("") fmt.Printf("Empty string error: %t\n", err != nil) // Zero number will fail validation var numValue optional.NonZero[int] err = numValue.Parse(0) fmt.Printf("Zero number error: %t\n", err != nil) // Must() will panic on empty optionals defer func() { if r := recover(); r != nil { fmt.Println("Must() panicked on empty optional as expected") } }() strValue.MustParse(nil) strValue.Must() // This will panic }
Output: Value: non-empty string, Exists: true HasValue after nil: false Empty string error: true Zero number error: true Must() panicked on empty optional as expected
type NonZeroCharset ¶
type NonZeroCharset[T constraint.Text, F charset.Filter] struct { Custom[T, validate.Charset[T, F]] }
NonZeroCharset combines NonZero and Charset
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" "github.com/metafates/schema/validate/charset" ) func main() { // NonZeroCharset requires non-empty strings var value optional.NonZeroCharset[string, charset.Or[charset.Letter, charset.Number]] value.MustParse("abc123DEF") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Empty strings will fail validation var invalidValue optional.NonZeroCharset[string, charset.Or[charset.Letter, charset.Number]] err := invalidValue.Parse("") fmt.Printf("Empty string error: %t\n", err != nil) // Non-alphanumeric characters will fail validation err = invalidValue.Parse("abc123!") fmt.Printf("Non-alphanumeric error: %t\n", err != nil) }
Output: Value: abc123DEF, Exists: true After nil: Exists: false Empty string error: true Non-alphanumeric error: true
type Odd ¶
type Odd[T constraint.Integer] struct { Custom[T, validate.Odd[T]] }
Odd accepts real numbers not divisible by two
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.Odd[int] // Valid odd value value.MustParse(43) val, exists := value.Get() fmt.Printf("Value: %d, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Even numbers will fail validation var invalidValue optional.Odd[int] err := invalidValue.Parse(2) fmt.Printf("Even number error: %t\n", err != nil) err = invalidValue.Parse(0) fmt.Printf("Zero error: %t\n", err != nil) }
Output: Value: 43, Exists: true After nil: Exists: false Even number error: true Zero error: true
type Positive ¶
type Positive[T constraint.Real] struct { Custom[T, validate.Positive[T]] }
Positive accepts all positive real numbers and zero
See also Negative
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var intValue optional.Positive[int] // Valid positive value intValue.MustParse(42) val, exists := intValue.Get() fmt.Printf("Value: %d, Exists: %t\n", val, exists) // Empty optional is valid intValue.MustParse(nil) val, exists = intValue.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Zero and negative values will fail validation var invalidValue optional.Positive[int] err := invalidValue.Parse(0) fmt.Printf("Zero error: %t\n", err != nil) err = invalidValue.Parse(-5) fmt.Printf("Negative error: %t\n", err != nil) }
Output: Value: 42, Exists: true After nil: Exists: false Zero error: true Negative error: true
type Positive0 ¶
type Positive0[T constraint.Real] struct { Custom[T, validate.Positive0[T]] }
Positive0 accepts all positive real numbers including zero.
See Positive for zero excluding variant.
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var intValue optional.Positive0[int] // Valid positive value intValue.MustParse(42) val, exists := intValue.Get() fmt.Printf("Value: %d, Exists: %t\n", val, exists) // Zero is valid for Positive0 intValue.MustParse(0) val, exists = intValue.Get() fmt.Printf("Zero value: %d, Exists: %t\n", val, exists) // Empty optional is valid intValue.MustParse(nil) val, exists = intValue.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Negative values will fail validation var invalidValue optional.Positive0[int] err := invalidValue.Parse(-5) fmt.Printf("Negative error: %t\n", err != nil) }
Output: Value: 42, Exists: true Zero value: 0, Exists: true After nil: Exists: false Negative error: true
type URL ¶
type URL[T constraint.Text] struct { Custom[T, validate.URL[T]] }
URL accepts a single url. The url may be relative (a path, without a host) or absolute (starting with a scheme)
See also HTTPURL
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.URL[string] // Valid URL value.MustParse("https://example.com") val, exists := value.Get() fmt.Printf("Value: %s, Exists: %t\n", val, exists) // Relative URLs are valid too value.MustParse("/relative/path") val, exists = value.Get() fmt.Printf("Relative URL: %s, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid URLs will fail validation var invalidValue optional.URL[string] err := invalidValue.Parse("htt ps://com example") fmt.Printf("Invalid URL error: %t\n", err != nil) }
Output: Value: https://example.com, Exists: true Relative URL: /relative/path, Exists: true After nil: Exists: false Invalid URL error: true
type UUID ¶
type UUID[T constraint.Text] struct { Custom[T, validate.UUID[T]] }
UUID accepts a properly formatted UUID in one of the following formats:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { var value optional.UUID[string] // Valid UUID value.MustParse("550e8400-e29b-41d4-a716-446655440000") _, exists := value.Get() fmt.Printf("Value exists: %t\n", exists) // Empty optional is valid value.MustParse(nil) _, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Invalid UUIDs will fail validation var invalidValue optional.UUID[string] err := invalidValue.Parse("not-a-uuid") fmt.Printf("Invalid UUID error: %t\n", err != nil) }
Output: Value exists: true After nil: Exists: false Invalid UUID error: true
type Unique ¶
type Unique[S ~[]T, T comparable] struct { Custom[S, validate.Unique[S, T]] }
Unique accepts a slice-like of unique values
See UniqueSlice for a slice shortcut
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { // Unique with a slice type var value optional.Unique[[]int, int] value.MustParse([]int{1, 2, 3, 4, 5}) val, exists := value.Get() fmt.Printf("Value: %v, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Duplicate values will fail validation var invalidValue optional.Unique[[]int, int] err := invalidValue.Parse([]int{1, 2, 3, 1, 4}) fmt.Printf("Duplicate value error: %t\n", err != nil) }
Output: Value: [1 2 3 4 5], Exists: true After nil: Exists: false Duplicate value error: true
type UniqueSlice ¶
type UniqueSlice[T comparable] struct { Custom[[]T, validate.UniqueSlice[T]] }
Unique accepts a slice of unique values
See Unique for a more generic version
Example ¶
package main import ( "fmt" "github.com/metafates/schema/optional" ) func main() { // UniqueSlice is a simplified version of Unique var value optional.UniqueSlice[string] value.MustParse([]string{"apple", "banana", "cherry"}) val, exists := value.Get() fmt.Printf("Value: %v, Exists: %t\n", val, exists) // Empty optional is valid value.MustParse(nil) val, exists = value.Get() fmt.Printf("After nil: Exists: %t\n", exists) // Duplicate values will fail validation var invalidValue optional.UniqueSlice[string] err := invalidValue.Parse([]string{"apple", "banana", "apple"}) fmt.Printf("Duplicate value error: %t\n", err != nil) }
Output: Value: [apple banana cherry], Exists: true After nil: Exists: false Duplicate value error: true