static-regular-grammar 2.0.2

Derive macro for static regular grammar
Documentation
use static_regular_grammar::RegularGrammar;

/// URI Authority.
///
/// # Grammar
///
/// ```abnf
/// authority   = [ userinfo "@" ] host [ ":" port ]
///
/// userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )
///
/// host        = IP-literal / IPv4address / reg-name
///
/// port        = *DIGIT
/// ```
///
/// ## Host rules
///
/// ```abnf
/// IP-literal = "[" ( IPv6address / IPvFuture  ) "]"
///
/// IPvFuture  = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
///
/// IPv6address =                            6( h16 ":" ) ls32
///             /                       "::" 5( h16 ":" ) ls32
///             / [               h16 ] "::" 4( h16 ":" ) ls32
///             / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
///             / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
///             / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
///             / [ *4( h16 ":" ) h16 ] "::"              ls32
///             / [ *5( h16 ":" ) h16 ] "::"              h16
///             / [ *6( h16 ":" ) h16 ] "::"
///
/// ls32        = ( h16 ":" h16 ) / IPv4address
/// ; least-significant 32 bits of address
///
/// h16         = 1*4HEXDIG
/// ; 16 bits of address represented in hexadecimal
///
/// IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
///
/// dec-octet   = DIGIT                 ; 0-9
///             / %x31-39 DIGIT         ; 10-99
///             / "1" 2DIGIT            ; 100-199
///             / "2" %x30-34 DIGIT     ; 200-249
///             / "25" %x30-35          ; 250-255
///
/// reg-name    = *( unreserved / pct-encoded / sub-delims )
/// ```
///
/// ## Misc rules
///
/// ```abnf
/// reserved    = gen-delims / sub-delims
///
/// gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
///
/// sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
///             / "*" / "+" / "," / ";" / "="
///
/// unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
///
/// pct-encoded = "%" HEXDIG HEXDIG
/// ```
#[derive(RegularGrammar, PartialEq, Eq)]
#[grammar(
	cache = "target/examples/uri.automaton.cbor",
	sized(AuthorityBuf, derive(PartialEq, Eq)),
	serde
)]
pub struct Authority([u8]);

fn main() {
	Authority::new(b"timothee@example.org:12").unwrap();
	AuthorityBuf::new(b"timothee@example.org:12".to_vec()).unwrap();
}