utterance 0.1.2

A parser library for creating readable, natural-language-inspired domain-specific languages.
Documentation
use std::fmt;

use crate::lexer::{Punctuation, SpecialChar};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Symbol {
    Punctuation(Punctuation),
    SpecialChar(SpecialChar),
}

impl TryFrom<char> for Symbol {
    type Error = ();

    fn try_from(value: char) -> Result<Self, Self::Error> {
        if let Ok(punctuation) = Punctuation::try_from(value) {
            return Ok(Self::Punctuation(punctuation));
        }

        if let Ok(special_char) = SpecialChar::try_from(value) {
            return Ok(Self::SpecialChar(special_char));
        }

        Err(())
    }
}

impl Symbol {
    pub const fn as_str(&self) -> &'static str {
        match self {
            Self::Punctuation(punctuation) => punctuation.as_str(),
            Self::SpecialChar(special_char) => special_char.as_str(),
        }
    }
}

impl fmt::Display for Symbol {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_str(self.as_str())
    }
}