valkyrie-parser 0.2.5

The hand write parser of valkyrie language
Documentation
use super::*;
use crate::{utils::Ast2Hir, TupleLiteralNode};

impl crate::TupleLiteralStrictNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> Result<TupleNode> {
        let mut terms = vec![];
        for term in &self.tuple_pair {
            match term.to_hir(ctx) {
                Ok(o) => terms.push(o),
                Err(e) => ctx.add_error(e),
            }
        }
        Ok(TupleNode { kind: TupleKind::Tuple, terms: ArgumentsList { terms }, span: self.span.clone() })
    }
}

impl Ast2Hir<TupleNode> for crate::TupleLiteralNode {
    fn to_hir(&self, ctx: &mut ProgramState) -> TupleNode {
        TupleNode { kind: Default::default(), terms: self.tuple_terms.to_hir(ctx), span: self.span.clone() }
    }
}

impl Ast2Hir<ArgumentsList> for crate::TupleTermsNode {
    fn to_hir(&self, ctx: &mut ProgramState) -> ArgumentsList {
        let mut list = ArgumentsList::new(self.tuple_pair.len());
        for term in &self.tuple_pair {
            match term.to_hir(ctx) {
                Ok(o) => list.terms.push(o),
                Err(e) => ctx.add_error(e),
            }
        }
        list
    }
}
impl Ast2Hir<ArgumentsList> for TupleLiteralNode {
    fn to_hir(&self, ctx: &mut ProgramState) -> ArgumentsList {
        let mut out = ArgumentsList::new(self.tuple_terms.tuple_pair.len());
        for pair in &self.tuple_terms.tuple_pair {
            match pair.to_hir(ctx) {
                Ok(o) => out += o,
                Err(e) => *ctx += e,
            }
        }
        out
    }
}

impl crate::TuplePairNode {
    pub(crate) fn to_hir(&self, ctx: &mut ProgramState) -> Result<ArgumentTerm> {
        let key = match &self.tuple_key {
            Some(v) => v.build(ctx),
            None => ArgumentKey::Nothing,
        };
        Ok(ArgumentTerm { modifiers: Default::default(), key, value: self.main_expression.build(ctx)? })
    }
}

impl crate::TupleKeyNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> ArgumentKey {
        match self {
            Self::Identifier(v) => ArgumentKey::Symbol(v.build(ctx.file)),
            Self::TextRaw(v) => ArgumentKey::Symbol(v.build_id(ctx)),
            Self::Integer(v) => {
                ctx.add_error(
                    SyntaxError::new("tuple key cannot be a number")
                        .with_hint("Expect a symbol")
                        .with_range(&v.span)
                        .with_file(ctx.file),
                );

                ArgumentKey::Nothing
            }
        }
    }
}

impl crate::TupleCallNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> Result<ApplyCallNode> {
        let monadic = self.op_and_then.is_some();
        let arguments = match &self.tuple_literal {
            Some(s) => s.to_hir(ctx),
            None => ArgumentsList { terms: vec![] },
        };
        Ok(ApplyCallNode { monadic, caller: Default::default(), arguments, body: None, span: self.span.clone() })
    }
}
impl crate::InlineTupleCallNode {
    pub(crate) fn build(&self, ctx: &mut ProgramState) -> Result<ApplyCallNode> {
        let monadic = self.op_and_then.is_some();
        let arguments = self.tuple_literal.to_hir(ctx);
        Ok(ApplyCallNode { monadic, caller: Default::default(), arguments, body: None, span: self.span.clone() })
    }
}