pomsky-syntax 0.12.0

Parser for pomsky, a new regular expression language
Documentation
use crate::error::CharClassError;

use super::GroupItem;

pub(super) fn parse_ascii_group(
    name: &str,
    negative: bool,
) -> Result<Vec<GroupItem>, CharClassError> {
    if negative {
        return Err(CharClassError::Negative);
    }

    Ok(match name {
        "ascii_alpha" => {
            vec![GroupItem::range_unchecked('a', 'z'), GroupItem::range_unchecked('A', 'Z')]
        }
        "ascii_alnum" => vec![
            GroupItem::range_unchecked('0', '9'),
            GroupItem::range_unchecked('a', 'z'),
            GroupItem::range_unchecked('A', 'Z'),
        ],
        "ascii" => vec![GroupItem::range_unchecked('\0', '\x7F')],
        "ascii_blank" => vec![GroupItem::Char(' '), GroupItem::Char('\t')],
        "ascii_cntrl" => vec![GroupItem::range_unchecked('\0', '\x1F'), GroupItem::Char('\x7F')],
        "ascii_digit" => vec![GroupItem::range_unchecked('0', '9')],
        "ascii_graph" => vec![GroupItem::range_unchecked('!', '~')],
        "ascii_lower" => vec![GroupItem::range_unchecked('a', 'z')],
        "ascii_print" => vec![GroupItem::range_unchecked(' ', '~')],
        "ascii_punct" => vec![
            GroupItem::range_unchecked('!', '/'),
            GroupItem::range_unchecked(':', '@'),
            GroupItem::range_unchecked('[', '`'),
            GroupItem::range_unchecked('{', '~'),
        ],
        "ascii_space" => vec![GroupItem::range_unchecked('\t', '\r'), GroupItem::Char(' ')],
        "ascii_upper" => vec![GroupItem::range_unchecked('A', 'Z')],
        "ascii_word" => vec![
            GroupItem::range_unchecked('0', '9'),
            GroupItem::range_unchecked('a', 'z'),
            GroupItem::range_unchecked('A', 'Z'),
            GroupItem::Char('_'),
        ],
        "ascii_xdigit" => vec![
            GroupItem::range_unchecked('0', '9'),
            GroupItem::range_unchecked('a', 'f'),
            GroupItem::range_unchecked('A', 'F'),
        ],
        _ => {
            return Err(CharClassError::UnknownNamedClass {
                found: name.into(),
                extra_in_prefix: false,
                #[cfg(feature = "suggestions")]
                similar: crate::util::find_suggestion(name, OPTION_LIST.iter().copied()),
            });
        }
    })
}

#[cfg(feature = "suggestions")]
const OPTION_LIST: &[&str] = &[
    "ascii_alpha",
    "ascii_alnum",
    "ascii",
    "ascii_blank",
    "ascii_cntrl",
    "ascii_digit",
    "ascii_graph",
    "ascii_lower",
    "ascii_print",
    "ascii_punct",
    "ascii_space",
    "ascii_upper",
    "ascii_word",
    "ascii_xdigit",
];