valkyrie-parser 0.2.5

The hand write parser of valkyrie language
Documentation
use crate::helpers::ProgramState;
use nyar_error::Result;
use valkyrie_ast::*;

impl crate::LetPatternNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> Result<PatternNode> {
        match self {
            Self::BarePattern(v) => v.build(ctx),
            Self::StandardPattern(v) => v.build(ctx),
        }
    }
}
impl crate::StandardPatternNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> Result<PatternNode> {
        match self {
            Self::TuplePattern(v) => v.build(ctx),
        }
    }
}

impl crate::BarePatternNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> Result<PatternNode> {
        let mut terms = vec![];
        for node in &self.bare_pattern_item {
            match node.build(ctx) {
                Ok(o) => terms.push(o),
                Err(e) => ctx.add_error(e),
            }
        }
        let tuple = TuplePatternNode { bind: None, name: None, terms, span: Default::default() };
        Ok(PatternNode::Tuple(Box::new(tuple)))
    }
}

impl crate::BarePatternItemNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> Result<PatternNode> {
        let identifier = self.identifier.build(ctx.file);
        let id = IdentifierPattern { modifiers: Default::default(), identifier };
        Ok(PatternNode::Atom(Box::new(id)))
    }
}

impl crate::TuplePatternNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> Result<PatternNode> {
        let mut terms = vec![];
        for node in &self.pattern_item {
            match node.build(ctx) {
                Ok(o) => terms.push(o),
                Err(e) => return Err(e),
            }
        }
        let tuple = TuplePatternNode { bind: None, name: None, terms, span: Default::default() };
        Ok(PatternNode::Tuple(Box::new(tuple)))
    }
}
impl crate::PatternItemNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> Result<PatternNode> {
        let value = match self {
            Self::OmitDict => PatternNode::Atom(Box::new(IdentifierPattern {
                modifiers: Default::default(),
                identifier: IdentifierNode { name: "".to_string(), span: Default::default() },
            })),
            Self::OmitList => PatternNode::Atom(Box::new(IdentifierPattern {
                modifiers: Default::default(),
                identifier: IdentifierNode { name: "".to_string(), span: Default::default() },
            })),
            Self::TuplePatternItem(v) => v.build(ctx)?,
        };
        Ok(value)
    }
}

impl crate::TuplePatternItemNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> Result<PatternNode> {
        let identifier = self.identifier.build(ctx.file);
        let id = IdentifierPattern { modifiers: Default::default(), identifier };
        Ok(PatternNode::Atom(Box::new(id)))
    }
}