wp-lang 0.2.2

WPL language crate with AST, parser, evaluator, builtins, and generators.
Documentation
use super::super::prelude::*;
use crate::derive_base_prs;
use crate::eval::runtime::field::FieldEvalUnit;
use crate::eval::value::parse_def::PatternParser;
use winnow::ascii::digit1;
use wp_model_core::model::FNameStr;

derive_base_prs!(MobilePhoneP);

impl PatternParser for MobilePhoneP {
    fn pattern_parse(
        &self,
        _e_id: u64,
        _fpu: &FieldEvalUnit,
        _ups_sep: &WplSep,
        data: &mut &str,
        name: FNameStr,
        out: &mut Vec<DataField>,
    ) -> ModalResult<()> {
        let start = data.checkpoint();
        let phone = digit1
            .context(ctx_desc("<mobile_phone>"))
            .parse_next(data)?;
        if phone::is_valid_phone(phone) {
            out.push(DataField::from_mobile_phone(name, phone));
            Ok(())
        } else {
            Err(ErrMode::Backtrack(context_error(
                data,
                &start,
                "mobile_phone format not match",
            )))
        }
    }

    fn patten_gen(
        &self,
        _gen: &mut GenChannel,
        _f_conf: &WplField,
        _g_conf: Option<&FieldGenConf>,
    ) -> WplCodeResult<DataField> {
        unimplemented!("phone generate");
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::eval::value::test_utils::ParserTUnit;
    use orion_error::testcase::TestAssert;

    #[test]
    fn test_parse_mobile() {
        let mut data = "13562479856";
        let y = ParserTUnit::new(
            MobilePhoneP::default(),
            WplField::try_parse("mobile_phone").assert(),
        )
        .verify_parse_suc(&mut data)
        .assert();

        assert_eq!(
            y.first(),
            Some(&DataField::from_mobile_phone("mobile_phone", "13562479856"))
        );
    }
}