pub trait ValidatesType<T> {
fn validates(value: &T) -> bool;
}
mod bools;
mod chars;
mod collections;
mod datetimes;
mod durations;
mod floats;
mod integers;
mod ipaddr_bytes;
mod macaddr;
mod networks;
mod pathbufs;
mod pathbytes;
mod regexbytes;
mod socketaddr;
mod strings;
mod tuples;
mod urlbytes;
mod utf8;
mod uuid_bytes;
mod uuids;
mod values;
#[cfg(feature = "url")]
mod urls;
#[cfg(feature = "regex")]
mod regexes;
#[cfg(kani)]
mod kani_proofs;
#[cfg(all(feature = "verify-verus", verus))]
mod verus_proofs;
#[cfg(all(feature = "verify-creusot", creusot))]
mod creusot_proofs;
#[cfg(feature = "verify-prusti")]
mod prusti_proofs;
pub use utf8::{Utf8Bytes, is_valid_utf8};
#[cfg(kani)]
pub use uuid_bytes::{
UuidBytes, UuidV4Bytes, UuidV7Bytes, has_valid_variant, has_version, is_valid_v4, is_valid_v7,
};
pub use ipaddr_bytes::{
Ipv4Bytes, Ipv4Private, Ipv4Public, Ipv6Bytes, Ipv6Private, Ipv6Public, is_ipv4_private,
is_ipv6_private,
};
pub use macaddr::{
MacAddr, MacLocal, MacMulticast, MacUnicast, MacUniversal, is_local, is_multicast, is_unicast,
is_universal,
};
pub use socketaddr::{
SocketAddrV4Bytes, SocketAddrV4NonZero, SocketAddrV4Privileged, SocketAddrV4Unprivileged,
SocketAddrV6Bytes, SocketAddrV6NonZero, SocketAddrV6Privileged, SocketAddrV6Unprivileged,
is_dynamic_port, is_nonzero_port, is_privileged_port, is_registered_port, is_well_known_port,
};
#[cfg(unix)]
pub use pathbytes::{
PathAbsolute, PathBytes, PathNonEmpty, PathRelative, has_null_byte, is_absolute, is_relative,
};
pub use urlbytes::{
AuthorityBytes, SchemeBytes, UrlAbsoluteBytes, UrlBytes, UrlHttpBytes, UrlWithAuthorityBytes,
};
pub use regexbytes::{
BalancedDelimiters, RegexBytes, ValidCharClass, ValidEscapes, ValidQuantifiers,
};
pub use integers::{
I8Default, I8NonNegative,
I8NonZero,
I8NonZeroStyle,
I8Positive,
I8Range,
I8RangeStyle,
I16Default, I16NonNegative,
I16NonZero,
I16NonZeroStyle,
I16Positive,
I16Range,
I16RangeStyle,
I32Default, I32NonNegative,
I32NonZero,
I32Positive,
I32Range,
I32RangeStyle,
I64Default, I64NonNegative,
I64NonZero,
I64Positive,
I64Range,
I64RangeStyle,
I128Default, I128NonNegative,
I128NonZero,
I128Positive,
I128Range,
I128RangeStyle,
IsizeDefault, IsizeNonNegative,
IsizeNonZero,
IsizePositive,
IsizeRange,
IsizeRangeStyle,
U8Default, U8NonZero,
U8Positive,
U8Range,
U8RangeStyle,
U16Default, U16NonZero,
U16Positive,
U16Range,
U16RangeStyle,
U32Default, U32NonZero,
U32Positive,
U32Range,
U32RangeStyle,
U64Default, U64NonZero,
U64Positive,
U64Range,
U64RangeStyle,
U128Default, U128NonZero,
U128Positive,
U128Range,
U128RangeStyle,
UsizeDefault, UsizeNonZero,
UsizePositive,
UsizeRange,
UsizeRangeStyle,
};
pub use floats::{
F32Default, F32Finite,
F32NonNegative,
F32Positive,
F64Default, F64Finite,
F64NonNegative,
F64Positive,
};
pub use bools::{BoolDefault, BoolFalse, BoolTrue};
pub use chars::{CharAlphabetic, CharAlphanumeric, CharNumeric};
pub use strings::{StringDefault, StringNonEmpty};
pub use collections::{
ArcNonNull, ArcSatisfies, ArrayAllSatisfy, BTreeMapNonEmpty, BTreeSetNonEmpty, BoxNonNull,
BoxSatisfies, HashMapNonEmpty, HashSetNonEmpty, LinkedListNonEmpty, OptionSome, RcNonNull,
RcSatisfies, ResultOk, VecAllSatisfy, VecDequeNonEmpty, VecNonEmpty,
};
pub use tuples::{Tuple2, Tuple3, Tuple4};
pub use durations::{DurationNonZero, DurationPositive};
pub use networks::{IpPrivate, IpPublic, IpV4, IpV6, Ipv4Loopback, Ipv6Loopback};
pub use pathbufs::{PathBufExists, PathBufIsDir, PathBufIsFile, PathBufReadable};
#[cfg(feature = "uuid")]
pub use uuids::{UuidNonNil, UuidV4};
#[cfg(feature = "chrono")]
pub use datetimes::{DateTimeUtcAfter, DateTimeUtcBefore, NaiveDateTimeAfter};
#[cfg(feature = "time")]
pub use datetimes::{OffsetDateTimeAfter, OffsetDateTimeBefore};
#[cfg(feature = "jiff")]
pub use datetimes::{TimestampAfter, TimestampBefore};
#[cfg(feature = "serde_json")]
pub use values::{ValueArray, ValueNonNull, ValueObject};
#[cfg(feature = "url")]
pub use urls::{UrlCanBeBase, UrlHttp, UrlHttps, UrlValid, UrlWithHost};
#[cfg(feature = "regex")]
pub use regexes::{
RegexCaseInsensitive, RegexMultiline, RegexSetNonEmpty, RegexSetValid, RegexValid,
};
#[derive(Debug, Clone, PartialEq, derive_more::Display)]
pub enum ValidationError {
#[display("Value must be positive (> 0), got {}", _0)]
NotPositive(i128),
#[display("Value must be non-negative (>= 0), got {}", _0)]
Negative(i128),
#[display("Value must be non-zero")]
Zero,
#[display("Value must be finite (not NaN or infinite), got {}", _0)]
NotFinite(String),
#[display("Value must be positive (> 0.0), got {}", _0)]
FloatNotPositive(f64),
#[display("Value must be non-negative (>= 0.0), got {}", _0)]
FloatNegative(f64),
#[display("Value {} is outside range [{}, {}]", value, min, max)]
FloatOutOfRange {
value: f64,
min: f64,
max: f64,
},
#[display("Value {} is outside range [{}, {}]", value, min, max)]
OutOfRange {
value: i128,
min: i128,
max: i128,
},
#[display("String must be non-empty")]
EmptyString,
#[display("String length {} exceeds maximum {}", actual, max)]
StringTooLong {
actual: usize,
max: usize,
},
#[display("String length {} is below minimum {}", actual, min)]
StringTooShort {
actual: usize,
min: usize,
},
#[display("Value must be true, got false")]
NotTrue,
#[display("Value must be false, got true")]
NotFalse,
#[display("Character '{}' is not alphabetic", _0)]
NotAlphabetic(char),
#[display("Character '{}' is not numeric", _0)]
NotNumeric(char),
#[display("Character '{}' is not alphanumeric", _0)]
NotAlphanumeric(char),
#[display("UUID must be version {}, got version {}", expected, got)]
WrongUuidVersion {
expected: u8,
got: u8,
},
#[display("UUID must be non-nil (not all zeros)")]
NilUuid,
#[display("Duration must be positive (not zero)")]
DurationNotPositive,
#[display("IP address must be private (RFC 1918/4193)")]
NotPrivateIp,
#[display("IP address must be public (not RFC 1918/4193)")]
NotPublicIp,
#[display("Expected IPv4 address, got IPv6")]
ExpectedIpv4GotIpv6,
#[display("Expected IPv6 address, got IPv4")]
ExpectedIpv6GotIpv4,
#[display("IP address must be loopback")]
NotLoopback,
#[display("Path does not exist: {}", _0)]
PathDoesNotExist(String),
#[display("Path is not readable: {}", _0)]
PathNotReadable(String),
#[display("Path is not a directory: {}", _0)]
PathNotDirectory(String),
#[display("Path is not a file: {}", _0)]
PathNotFile(String),
#[display("DateTime must be after {}, got {}", threshold, value)]
DateTimeTooEarly {
value: String,
threshold: String,
},
#[display("DateTime must be before {}, got {}", threshold, value)]
DateTimeTooLate {
value: String,
threshold: String,
},
#[display("Collection must be non-empty")]
EmptyCollection,
#[display("Option must be Some, not None")]
OptionIsNone,
#[display("Result must be Ok, not Err")]
ResultIsErr,
#[display("JSON must be {}, got {}", expected, got)]
WrongJsonType {
expected: String,
got: String,
},
#[display("JSON must be non-null")]
JsonIsNull,
#[display("URL is invalid or cannot be parsed")]
UrlInvalid,
#[display("URL syntax is invalid")]
InvalidUrlSyntax,
#[display("URL must have authority (//host)")]
UrlMissingAuthority,
#[display("URL must be absolute (scheme://host)")]
UrlNotAbsolute,
#[display("URL must use HTTPS scheme")]
UrlNotHttps,
#[display("URL must use HTTP or HTTPS scheme")]
UrlNotHttp,
#[display("Regex syntax is invalid")]
InvalidRegexSyntax,
#[display("URL must have a host")]
UrlNoHost,
#[display("URL cannot be used as a base")]
UrlCannotBeBase,
#[display("Regex pattern is invalid or cannot be compiled")]
RegexInvalid,
#[display("Invalid UUID variant bits")]
InvalidUuidVariant,
#[display("MAC address must be unicast")]
NotUnicastMac,
#[display("MAC address must be multicast")]
NotMulticastMac,
#[display("MAC address must be universal (IEEE assigned)")]
NotUniversalMac,
#[display("MAC address must be locally administered")]
NotLocalMac,
#[display("Port must be non-zero")]
PortIsZero,
#[display("Port must be privileged (< 1024), got {}", _0)]
PortNotPrivileged(u16),
#[display("Port must be unprivileged (>= 1024), got {}", _0)]
PortIsPrivileged(u16),
#[display("Path contains null byte")]
PathContainsNull,
#[display("Path must be absolute (start with /), got: {}", _0)]
PathNotAbsolute(String),
#[display("Path must be relative (not start with /), got: {}", _0)]
PathNotRelative(String),
#[display("Invalid UTF-8 byte sequence")]
InvalidUtf8,
#[display("Value too long: max {max}, got {actual}")]
TooLong {
max: usize,
actual: usize,
},
}
impl std::error::Error for ValidationError {}