use crate::WplSep;
use crate::ast::group::GroupNot;
use crate::eval::runtime::group::{LogicProc, WplEvalGroup};
use winnow::stream::Stream;
use wp_model_core::model::DataField;
use wp_primitives::WResult as ModalResult;
impl LogicProc for GroupNot {
fn process(
&self,
e_id: u64,
group: &WplEvalGroup,
ups_sep: &WplSep,
data: &mut &str,
out: &mut Vec<DataField>,
) -> ModalResult<()> {
not_proc(e_id, group, ups_sep, data, out)
}
}
pub fn not_proc(
e_id: u64,
group: &WplEvalGroup,
ups_sep: &WplSep,
data: &mut &str,
out: &mut Vec<DataField>,
) -> ModalResult<()> {
let fpu = match group.field_units.first() {
Some(f) => f,
None => {
return Err(winnow::error::ErrMode::Backtrack(
winnow::error::ContextError::default(),
));
}
};
let cur_sep = group.combo_sep(ups_sep);
let ck_point = data.checkpoint();
let mut temp_out = Vec::new();
match fpu.parse(
e_id,
&cur_sep,
data,
Some(fpu.conf().safe_name()),
&mut temp_out,
) {
Ok(_) => {
data.reset(&ck_point);
Err(winnow::error::ErrMode::Backtrack(
winnow::error::ContextError::default(),
))
}
Err(_) => {
if let Some(first_field) = group.field_units.first() {
let name = first_field.conf().safe_name();
out.push(DataField::from_ignore(name));
}
Ok(())
}
}
}
#[cfg(test)]
mod tests {
use crate::parser::error::WplCodeResult;
use crate::{WplEvaluator, wpl_express};
use orion_error::testcase::TestAssert;
use wp_model_core::model::DataField;
use wp_primitives::Parser;
#[test]
fn test_not_group_basic() -> WplCodeResult<()> {
let express = wpl_express.parse(r#"not(symbol(ERROR):test)"#).assert();
let mut data = "INFO: hello world";
let ppl = WplEvaluator::from(&express, None)?;
let result = ppl.parse_groups(0, &mut data).assert();
println!("{}", result);
assert_eq!(
result.get_field_owned("test"),
Some(DataField::from_ignore("test"))
);
Ok(())
}
#[test]
fn test_not_group_failure() -> WplCodeResult<()> {
let express = wpl_express.parse(r#"not(symbol(ERROR):test)"#).assert();
let mut data = "ERROR: something wrong";
let ppl = WplEvaluator::from(&express, None)?;
let result = ppl.parse_groups(0, &mut data);
assert!(result.is_err(), "not() should fail when symbol matches");
Ok(())
}
#[test]
fn test_not_with_peek_symbol() -> WplCodeResult<()> {
let express = wpl_express
.parse(r#"not(peek_symbol(ERROR):test),(chars:msg)"#)
.assert();
let mut data = "INFO message";
let ppl = WplEvaluator::from(&express, None)?;
let result = ppl.parse_groups(0, &mut data).assert();
println!("{}", result);
assert_eq!(
result.get_field_owned("msg"),
Some(DataField::from_chars("msg", "INFO"))
);
Ok(())
}
}