enotation 0.2.0

Extended s-notation
Documentation
use std::fmt::Display;

use pest_ast::FromPest;

use crate::{ENotation, Rule};

#[derive(Debug, FromPest)]
#[pest_ast(rule(Rule::paren_list))]
pub struct PList {
    pub elems: Vec<ENotation>,
}

#[derive(Debug, FromPest)]
#[pest_ast(rule(Rule::bracket_list))]
pub struct BList {
    pub elems: Vec<ENotation>,
}

#[derive(Debug, FromPest)]
#[pest_ast(rule(Rule::list))]
pub enum List {
    PL(PList),
    BL(BList),
}

impl Display for BList {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "[")?;
        for (i, v) in self.elems.iter().enumerate() {
            if i == 0 {
                write!(f, "{}", v)?;
            } else {
                write!(f, " {}", v)?;
            }
        }
        write!(f, "]")
    }
}

impl Display for PList {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "(")?;
        for (i, v) in self.elems.iter().enumerate() {
            if i == 0 {
                write!(f, "{}", v)?;
            } else {
                write!(f, " {}", v)?;
            }
        }
        write!(f, ")")
    }
}

impl Display for List {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            List::PL(pl) => write!(f, "{}", pl),
            List::BL(bl) => write!(f, "{}", bl),
        }
    }
}