use crate::AsciiDictionary;
use entroll_core::Compact;

pub struct ArabicNumerals;

impl Compact for ArabicNumerals {
    fn compact(&self) -> &str {
        "0-9"
    }
}

impl AsciiDictionary for ArabicNumerals {
    fn name(&self) -> &str {
        "arabic numerals"
    }

    fn canonical(&self) -> &str {
        "arabic numerals[0-9]"
    }
}

impl Default for ArabicNumerals {
    fn default() -> Self {
        Self
    }
}

pub struct Hexadecimal;

impl Compact for Hexadecimal {
    fn compact(&self) -> &str {
        "0-9A-F"
    }
}

impl AsciiDictionary for Hexadecimal {
    fn name(&self) -> &str {
        "hexadecimal"
    }

    fn canonical(&self) -> &str {
        "hexadecimal[0-9A-F]"
    }
}

impl Default for Hexadecimal {
    fn default() -> Self {
        Self
    }
}

pub struct Alphanumeric;

impl Compact for Alphanumeric {
    fn compact(&self) -> &str {
        "0-9a-zA-Z"
    }
}

impl AsciiDictionary for Alphanumeric {
    fn name(&self) -> &str {
        "alphanumeric"
    }

    fn canonical(&self) -> &str {
        "alphanumeric[0-9a-zA-Z]"
    }
}

impl Default for Alphanumeric {
    fn default() -> Self {
        Self
    }
}

pub struct Expect;

impl Compact for Expect {
    fn compact(&self) -> &str {
        "0-9a-zA-Z!@#$%~^&*()=_+[]{}\\|;:'\"<>,.?/-"
    }
}

impl AsciiDictionary for Expect {
    fn name(&self) -> &str {
        "expect"
    }

    fn canonical(&self) -> &str {
        "expect[0-9a-zA-Z!@#$%~^&*()=_+[]{}\\|;:'\"<>,.?/-]"
    }
}

impl Default for Expect {
    fn default() -> Self {
        Self
    }
}
