iri-string 0.7.0

IRI as string types
Documentation
//! Characters.

/// Properties of ASCII characters.
///
/// About `'` (single quote) being considered as a literal: see
/// [Errata ID 6937](https://www.rfc-editor.org/errata/eid6937).
const CHARS_TABLE: [u8; 128] = [
    0b_0000_0000, // NUL
    0b_0000_0000, // SOH
    0b_0000_0000, // STX
    0b_0000_0000, // ETX
    0b_0000_0000, // EOT
    0b_0000_0000, // ENQ
    0b_0000_0000, // ACK
    0b_0000_0000, // BEL
    0b_0000_0000, // BS
    0b_0000_0000, // HT
    0b_0000_0000, // LF
    0b_0000_0000, // VT
    0b_0000_0000, // FF
    0b_0000_0000, // CR
    0b_0000_0000, // SO
    0b_0000_0000, // SI
    0b_0000_0000, // DLE
    0b_0000_0000, // DC1
    0b_0000_0000, // DC2
    0b_0000_0000, // DC3
    0b_0000_0000, // DC4
    0b_0000_0000, // NAK
    0b_0000_0000, // SYN
    0b_0000_0000, // ETB
    0b_0000_0000, // CAN
    0b_0000_0000, // EM
    0b_0000_0000, // SUB
    0b_0000_0000, // ESC
    0b_0000_0000, // FS
    0b_0000_0000, // GS
    0b_0000_0000, // RS
    0b_0000_0000, // US
    0b_0000_0000, // SPACE
    0b_0000_0001, // !
    0b_0000_0000, // "
    0b_0000_0001, // #
    0b_0000_0001, // $
    0b_0000_0000, // %
    0b_0000_0001, // &
    0b_0000_0001, // '
    0b_0000_0001, // (
    0b_0000_0001, // )
    0b_0000_0001, // *
    0b_0000_0001, // +
    0b_0000_0001, // ,
    0b_0000_0001, // -
    0b_0000_0101, // .
    0b_0000_0001, // /
    0b_0000_0111, // 0
    0b_0000_0111, // 1
    0b_0000_0111, // 2
    0b_0000_0111, // 3
    0b_0000_0111, // 4
    0b_0000_0111, // 5
    0b_0000_0111, // 6
    0b_0000_0111, // 7
    0b_0000_0111, // 8
    0b_0000_0111, // 9
    0b_0000_0001, // :
    0b_0000_0001, // ;
    0b_0000_0000, // <
    0b_0000_0001, // =
    0b_0000_0000, // >
    0b_0000_0001, // ?
    0b_0000_0001, // @
    0b_0000_0111, // A
    0b_0000_0111, // B
    0b_0000_0111, // C
    0b_0000_0111, // D
    0b_0000_0111, // E
    0b_0000_0111, // F
    0b_0000_0111, // G
    0b_0000_0111, // H
    0b_0000_0111, // I
    0b_0000_0111, // J
    0b_0000_0111, // K
    0b_0000_0111, // L
    0b_0000_0111, // M
    0b_0000_0111, // N
    0b_0000_0111, // O
    0b_0000_0111, // P
    0b_0000_0111, // Q
    0b_0000_0111, // R
    0b_0000_0111, // S
    0b_0000_0111, // T
    0b_0000_0111, // U
    0b_0000_0111, // V
    0b_0000_0111, // W
    0b_0000_0111, // X
    0b_0000_0111, // Y
    0b_0000_0111, // Z
    0b_0000_0001, // [
    0b_0000_0000, // \
    0b_0000_0001, // ]
    0b_0000_0000, // ^
    0b_0000_0111, // _
    0b_0000_0000, // `
    0b_0000_0111, // a
    0b_0000_0111, // b
    0b_0000_0111, // c
    0b_0000_0111, // d
    0b_0000_0111, // e
    0b_0000_0111, // f
    0b_0000_0111, // g
    0b_0000_0111, // h
    0b_0000_0111, // i
    0b_0000_0111, // j
    0b_0000_0111, // k
    0b_0000_0111, // l
    0b_0000_0111, // m
    0b_0000_0111, // n
    0b_0000_0111, // o
    0b_0000_0111, // p
    0b_0000_0111, // q
    0b_0000_0111, // r
    0b_0000_0111, // s
    0b_0000_0111, // t
    0b_0000_0111, // u
    0b_0000_0111, // v
    0b_0000_0111, // w
    0b_0000_0111, // x
    0b_0000_0111, // y
    0b_0000_0111, // z
    0b_0000_0000, // {
    0b_0000_0000, // |
    0b_0000_0000, // }
    0b_0000_0001, // ~
    0b_0000_0000, // DEL
];

/// A mask to test whether the character matches `literals` rule defined in [RFC 6570].
///
/// [RFC 6570]: https://www.rfc-editor.org/rfc/rfc6570.html#section-2.1
const CHARS_TABLE_MASK_LITERAL: u8 = 1 << 0;

/// A mask to test whether the character matches `varchar` rule defined in [RFC 6570].
///
/// [RFC 6570]: https://www.rfc-editor.org/rfc/rfc6570.html#section-2.3
const CHARS_TABLE_MASK_VARCHAR_START: u8 = 1 << 1;

/// A mask to test whether the character matches `varchar` rule defined in [RFC 6570] or a period.
///
/// [RFC 6570]: https://www.rfc-editor.org/rfc/rfc6570.html#section-2.3
const CHARS_TABLE_MASK_VARCHAR_CONTINUE: u8 = 1 << 2;

/// Returns true if the given ASCII character is allowed in a literal string.
///
/// # Precondition
///
/// The given byte should be an ASCII character, i.e. should be less than 128.
#[inline]
#[must_use]
pub(super) const fn is_ascii_literal_char(c: u8) -> bool {
    (CHARS_TABLE[c as usize] & CHARS_TABLE_MASK_LITERAL) != 0
}

/// Returns true if the given ASCII character is allowed as the beginning of the `varname`.
///
/// Note that this does not return true for `%` character. It is caller's
/// responsibility to test validity of percent-encoded triplets.
///
/// # Precondition
///
/// The given byte should be an ASCII character, i.e. should be less than 128.
#[inline]
#[must_use]
pub(super) const fn is_ascii_varchar_start(c: u8) -> bool {
    (CHARS_TABLE[c as usize] & CHARS_TABLE_MASK_VARCHAR_START) != 0
}

/// Returns true if the given ASCII character is allowed as the non-beginning of the `varname`.
///
/// Note that this does not return true for `%` character. It is caller's
/// responsibility to test validity of percent-encoded triplets.
///
/// # Precondition
///
/// The given byte should be an ASCII character, i.e. should be less than 128.
#[inline]
#[must_use]
pub(super) const fn is_ascii_varchar_continue(c: u8) -> bool {
    (CHARS_TABLE[c as usize] & CHARS_TABLE_MASK_VARCHAR_CONTINUE) != 0
}