wp-lang 0.2.2

WPL language crate with AST, parser, evaluator, builtins, and generators.
Documentation
use crate::ast::WplSep;
use crate::eval::runtime::field::FieldEvalUnit;
use crate::parser::utils::{quot_r_str, quot_str, window_path};
use winnow::ascii::multispace0;
use winnow::combinator::alt;
use wp_model_core::model::DataField;
use wp_primitives::Parser;
use wp_primitives::WResult as ModalResult;

pub mod array;
pub mod bad_json;
pub mod base64;
pub mod json;
pub mod json_exact;
mod json_impl;
pub mod keyval;
pub mod kvarr;
pub mod proto_text;

pub fn take_sub_tdo(
    e_id: u64,
    fpu: &FieldEvalUnit,
    upper_sep: &WplSep,
    data: &mut &str,
    key: &str,
    out: &mut Vec<DataField>,
) -> ModalResult<()> {
    multispace0.parse_next(data)?;
    let str_val_r = alt((quot_r_str, quot_str, window_path)).parse_next(data);
    match str_val_r {
        Ok(mut str_val) => {
            if let Some(sub_fpu) = fpu.get_sub_fpu(key) {
                let mut prefer_sep = fpu.conf().resolve_sep(upper_sep);
                prefer_sep.apply_default(WplSep::inherited_sep("\\0"));
                let run_key = sub_fpu.conf().run_key(key);
                Ok(sub_fpu.parse(e_id, &prefer_sep, &mut str_val, run_key, out)?)
            } else {
                out.push(DataField::from_chars(key, str_val));
                Ok(())
            }
        }
        Err(_) => {
            if let Some(sub_fpu) = fpu.get_sub_fpu(key) {
                let mut prefer_sep = fpu.conf().resolve_sep(upper_sep);
                prefer_sep.apply_default(WplSep::inherited_sep("\\0"));
                let run_key = sub_fpu.conf().run_key(key);
                Ok(sub_fpu.parse(e_id, &prefer_sep, data, run_key, out)?)
            } else {
                let sep = fpu.conf().resolve_sep(upper_sep);
                let val = sep.read_until_sep(data)?;
                let trim_val = val.trim();
                out.push(DataField::from_chars(key, trim_val));
                Ok(())
            }
        }
    }
}