#![warn(clippy::pedantic)] use once_cell::sync::Lazy; use std::collections::HashSet; // This is the character set containing just the alphabetic characters // from the ASCII character set. pub static ALPHA: Lazy> = Lazy::new(|| ('a'..='z') .chain('A'..='Z') .collect() ); // This is the character set containing just numbers. pub static DIGIT: Lazy> = Lazy::new(|| ('0'..='9') .collect() ); // This is the character set containing just the characters allowed // in a hexadecimal digit. pub static HEXDIG: Lazy> = Lazy::new(|| DIGIT.iter().copied() .chain('A'..='F') .chain('a'..='f') .collect() ); // This is the character set corresponds to the "unreserved" syntax // specified in RFC 3986 (https://tools.ietf.org/html/rfc3986). pub static UNRESERVED: Lazy> = Lazy::new(|| ALPHA.iter() .chain(DIGIT.iter()) .chain(['-', '.', '_', '~'].iter()) .copied() .collect() ); // This is the character set corresponds to the "sub-delims" syntax // specified in RFC 3986 (https://tools.ietf.org/html/rfc3986). pub static SUB_DELIMS: Lazy> = Lazy::new(|| [ '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=' ] .iter() .copied() .collect() ); // This is the character set corresponds to the second part // of the "scheme" syntax // specified in RFC 3986 (https://tools.ietf.org/html/rfc3986). pub static SCHEME_NOT_FIRST: Lazy> = Lazy::new(|| ALPHA.iter() .chain(DIGIT.iter()) .chain(['+', '-', '.'].iter()) .copied() .collect() ); // This is the character set corresponds to the "pchar" syntax // specified in RFC 3986 (https://tools.ietf.org/html/rfc3986), // leaving out "pct-encoded". pub static PCHAR_NOT_PCT_ENCODED: Lazy> = Lazy::new(|| UNRESERVED.iter() .chain(SUB_DELIMS.iter()) .chain([':', '@'].iter()) .copied() .collect() ); // This is the character set corresponds to the "query" syntax // and the "fragment" syntax // specified in RFC 3986 (https://tools.ietf.org/html/rfc3986), // leaving out "pct-encoded". pub static QUERY_OR_FRAGMENT_NOT_PCT_ENCODED: Lazy> = Lazy::new(|| PCHAR_NOT_PCT_ENCODED.iter() .chain(['/', '?'].iter()) .copied() .collect() ); // This is the character set almost corresponds to the "query" syntax // specified in RFC 3986 (https://tools.ietf.org/html/rfc3986), // leaving out "pct-encoded", except that '+' is also excluded, because // for some web services (e.g. AWS S3) a '+' is treated as // synonymous with a space (' ') and thus gets misinterpreted. pub static QUERY_NOT_PCT_ENCODED_WITHOUT_PLUS: Lazy> = Lazy::new(|| UNRESERVED.iter() .chain([ '!', '$', '&', '\'', '(', ')', '*', ',', ';', '=', ':', '@', '/', '?' ].iter()) .copied() .collect() ); // This is the character set corresponds to the "userinfo" syntax // specified in RFC 3986 (https://tools.ietf.org/html/rfc3986), // leaving out "pct-encoded". pub static USER_INFO_NOT_PCT_ENCODED: Lazy> = Lazy::new(|| UNRESERVED.iter() .chain(SUB_DELIMS.iter()) .chain([':'].iter()) .copied() .collect() ); // This is the character set corresponds to the "reg-name" syntax // specified in RFC 3986 (https://tools.ietf.org/html/rfc3986), // leaving out "pct-encoded". pub static REG_NAME_NOT_PCT_ENCODED: Lazy> = Lazy::new(|| UNRESERVED.iter() .chain(SUB_DELIMS.iter()) .copied() .collect() ); // This is the character set corresponds to the last part of // the "IPvFuture" syntax // specified in RFC 3986 (https://tools.ietf.org/html/rfc3986). pub static IPV_FUTURE_LAST_PART: Lazy> = Lazy::new(|| UNRESERVED.iter() .chain(SUB_DELIMS.iter()) .chain([':'].iter()) .copied() .collect() );