use crate::script::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ScriptP;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ScriptTextP;
pub(crate) fn script_text_regex(
pattern: &str,
negated: bool,
) -> Result<ArgP, Box<rhai::EvalAltResult>> {
let regex = crate::value::TextRegex::new(pattern).map_err(script_error)?;
Ok(if negated {
ArgP::NotRegex(regex)
} else {
ArgP::Regex(regex)
})
}
pub(crate) fn script_p_within(val: Dynamic) -> ArgP {
if val.is_array() {
ArgP::WithIn(val.cast::<rhai::Array>())
} else {
ArgP::WithIn(vec![val])
}
}
pub(crate) fn script_p_without(val: Dynamic) -> ArgP {
if val.is_array() {
ArgP::WithOut(val.cast::<rhai::Array>())
} else {
ArgP::WithOut(vec![val])
}
}
impl crate::value::literal::TokenLiteral for ArgP {
fn token_literal(&self) -> String {
crate::value::literal::TokenLiteral::token_literal(&argp_to_p(self))
}
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum ArgP {
Eq(Dynamic),
Neq(Dynamic),
Lt(Dynamic),
Gt(Dynamic),
Lte(Dynamic),
Gte(Dynamic),
WithIn(Vec<Dynamic>),
WithOut(Vec<Dynamic>),
Inside(Dynamic, Dynamic),
Outside(Dynamic, Dynamic),
Between(Dynamic, Dynamic),
StartingWith(Dynamic),
NotStartingWith(Dynamic),
EndingWith(Dynamic),
NotEndingWith(Dynamic),
Containing(Dynamic),
NotContaining(Dynamic),
Regex(crate::value::TextRegex),
NotRegex(crate::value::TextRegex),
TypeOf(GType),
And(Box<ArgP>, Box<ArgP>),
Or(Box<ArgP>, Box<ArgP>),
Not(Box<ArgP>),
}
#[export_module]
#[allow(non_snake_case, non_upper_case_globals)]
pub(crate) mod ArgPModule {
use super::{ArgP, GType, script_p_within, script_p_without};
use crate::value::literal::TokenLiteral;
pub fn eq(val: Dynamic) -> ArgP {
ArgP::Eq(val)
}
pub fn neq(val: Dynamic) -> ArgP {
ArgP::Neq(val)
}
pub fn lt(val: Dynamic) -> ArgP {
ArgP::Lt(val)
}
pub fn gt(val: Dynamic) -> ArgP {
ArgP::Gt(val)
}
pub fn lte(val: Dynamic) -> ArgP {
ArgP::Lte(val)
}
pub fn gte(val: Dynamic) -> ArgP {
ArgP::Gte(val)
}
pub fn within(val: Dynamic) -> ArgP {
script_p_within(val)
}
pub fn without(val: Dynamic) -> ArgP {
script_p_without(val)
}
pub fn inside(val: Dynamic, val1: Dynamic) -> ArgP {
ArgP::Inside(val, val1)
}
pub fn outside(val: Dynamic, val1: Dynamic) -> ArgP {
ArgP::Outside(val, val1)
}
pub fn between(val: Dynamic, val1: Dynamic) -> ArgP {
ArgP::Between(val, val1)
}
pub fn startingWith(val: Dynamic) -> ArgP {
ArgP::StartingWith(val)
}
pub fn starting_with(val: Dynamic) -> ArgP {
ArgP::StartingWith(val)
}
pub fn notStartingWith(val: Dynamic) -> ArgP {
ArgP::NotStartingWith(val)
}
pub fn not_starting_with(val: Dynamic) -> ArgP {
ArgP::NotStartingWith(val)
}
pub fn endingWith(val: Dynamic) -> ArgP {
ArgP::EndingWith(val)
}
pub fn ending_with(val: Dynamic) -> ArgP {
ArgP::EndingWith(val)
}
pub fn notEndingWith(val: Dynamic) -> ArgP {
ArgP::NotEndingWith(val)
}
pub fn not_ending_with(val: Dynamic) -> ArgP {
ArgP::NotEndingWith(val)
}
pub fn containing(val: Dynamic) -> ArgP {
ArgP::Containing(val)
}
pub fn notContaining(val: Dynamic) -> ArgP {
ArgP::NotContaining(val)
}
pub fn not_containing(val: Dynamic) -> ArgP {
ArgP::NotContaining(val)
}
pub fn typeOf(val: GType) -> ArgP {
ArgP::TypeOf(val)
}
#[rhai_fn(global, get = "enum_type", pure)]
pub fn get_type(arg_p: &mut ArgP) -> String {
match arg_p {
ArgP::Eq(_) => "Eq",
ArgP::Neq(_) => "Neq",
ArgP::Lt(_) => "Lt",
ArgP::Gt(_) => "Gt",
ArgP::Lte(_) => "Lte",
ArgP::Gte(_) => "Gte",
ArgP::WithIn(_) => "WithIn",
ArgP::WithOut(_) => "WithOut",
ArgP::Inside(_, _) => "Inside",
ArgP::Outside(_, _) => "Outside",
ArgP::Between(_, _) => "Between",
ArgP::StartingWith(_) => "StartingWith",
ArgP::NotStartingWith(_) => "NotStartingWith",
ArgP::EndingWith(_) => "EndingWith",
ArgP::NotEndingWith(_) => "NotEndingWith",
ArgP::Containing(_) => "Containing",
ArgP::NotContaining(_) => "NotContaining",
ArgP::Regex(_) => "Regex",
ArgP::NotRegex(_) => "NotRegex",
ArgP::TypeOf(_) => "TypeOf",
ArgP::And(_, _) => "And",
ArgP::Or(_, _) => "Or",
ArgP::Not(_) => "Not",
}
.to_string()
}
#[rhai_fn(global, get = "value", pure)]
pub fn get_value(arg_p: &mut ArgP) -> Dynamic {
match arg_p {
ArgP::Eq(val)
| ArgP::Neq(val)
| ArgP::Lt(val)
| ArgP::Gt(val)
| ArgP::Lte(val)
| ArgP::Gte(val)
| ArgP::StartingWith(val)
| ArgP::NotStartingWith(val)
| ArgP::EndingWith(val)
| ArgP::NotEndingWith(val)
| ArgP::Containing(val)
| ArgP::NotContaining(val) => val.clone(),
ArgP::Inside(a_l, a_r) | ArgP::Outside(a_l, a_r) | ArgP::Between(a_l, a_r) => {
Dynamic::from((a_l.clone(), a_r.clone()))
}
ArgP::WithIn(val) | ArgP::WithOut(val) => Dynamic::from_array(val.clone()),
ArgP::TypeOf(target) => Dynamic::from(target.clone()),
ArgP::Regex(regex) | ArgP::NotRegex(regex) => Dynamic::from(regex.as_str().to_string()),
ArgP::And(a, b) | ArgP::Or(a, b) => {
Dynamic::from((Dynamic::from((**a).clone()), Dynamic::from((**b).clone())))
}
ArgP::Not(inner) => Dynamic::from((**inner).clone()),
}
}
#[rhai_fn(global, pure)]
pub fn negate(arg_p: &mut ArgP) -> ArgP {
ArgP::Not(Box::new(arg_p.clone()))
}
#[rhai_fn(global, name = "to_string", name = "to_debug", pure)]
pub fn to_string(arg_p: &mut ArgP) -> String {
arg_p.token_literal()
}
}
#[export_module]
#[allow(non_snake_case)]
pub(crate) mod ArgPPascalModule {
use super::{ArgP, GType, script_p_within, script_p_without};
pub fn Eq(val: Dynamic) -> ArgP {
ArgP::Eq(val)
}
pub fn Neq(val: Dynamic) -> ArgP {
ArgP::Neq(val)
}
pub fn Lt(val: Dynamic) -> ArgP {
ArgP::Lt(val)
}
pub fn Gt(val: Dynamic) -> ArgP {
ArgP::Gt(val)
}
pub fn Lte(val: Dynamic) -> ArgP {
ArgP::Lte(val)
}
pub fn Gte(val: Dynamic) -> ArgP {
ArgP::Gte(val)
}
pub fn WithIn(val: Dynamic) -> ArgP {
script_p_within(val)
}
pub fn WithOut(val: Dynamic) -> ArgP {
script_p_without(val)
}
pub fn Inside(val: Dynamic, val1: Dynamic) -> ArgP {
ArgP::Inside(val, val1)
}
pub fn Outside(val: Dynamic, val1: Dynamic) -> ArgP {
ArgP::Outside(val, val1)
}
pub fn Between(val: Dynamic, val1: Dynamic) -> ArgP {
ArgP::Between(val, val1)
}
pub fn StartingWith(val: Dynamic) -> ArgP {
ArgP::StartingWith(val)
}
pub fn NotStartingWith(val: Dynamic) -> ArgP {
ArgP::NotStartingWith(val)
}
pub fn EndingWith(val: Dynamic) -> ArgP {
ArgP::EndingWith(val)
}
pub fn NotEndingWith(val: Dynamic) -> ArgP {
ArgP::NotEndingWith(val)
}
pub fn Containing(val: Dynamic) -> ArgP {
ArgP::Containing(val)
}
pub fn NotContaining(val: Dynamic) -> ArgP {
ArgP::NotContaining(val)
}
pub fn TypeOf(val: GType) -> ArgP {
ArgP::TypeOf(val)
}
}
#[export_module]
#[allow(non_snake_case, non_upper_case_globals)]
pub(crate) mod TextPModule {
use super::{ArgP, script_text_regex};
#[rhai_fn(return_raw)]
pub fn regex(pattern: &str) -> Result<ArgP, Box<rhai::EvalAltResult>> {
script_text_regex(pattern, false)
}
#[rhai_fn(return_raw)]
pub fn notRegex(pattern: &str) -> Result<ArgP, Box<rhai::EvalAltResult>> {
script_text_regex(pattern, true)
}
#[rhai_fn(return_raw)]
pub fn not_regex(pattern: &str) -> Result<ArgP, Box<rhai::EvalAltResult>> {
script_text_regex(pattern, true)
}
pub fn startingWith(val: Dynamic) -> ArgP {
ArgP::StartingWith(val)
}
pub fn starting_with(val: Dynamic) -> ArgP {
ArgP::StartingWith(val)
}
pub fn notStartingWith(val: Dynamic) -> ArgP {
ArgP::NotStartingWith(val)
}
pub fn not_starting_with(val: Dynamic) -> ArgP {
ArgP::NotStartingWith(val)
}
pub fn endingWith(val: Dynamic) -> ArgP {
ArgP::EndingWith(val)
}
pub fn ending_with(val: Dynamic) -> ArgP {
ArgP::EndingWith(val)
}
pub fn notEndingWith(val: Dynamic) -> ArgP {
ArgP::NotEndingWith(val)
}
pub fn not_ending_with(val: Dynamic) -> ArgP {
ArgP::NotEndingWith(val)
}
pub fn containing(val: Dynamic) -> ArgP {
ArgP::Containing(val)
}
pub fn notContaining(val: Dynamic) -> ArgP {
ArgP::NotContaining(val)
}
pub fn not_containing(val: Dynamic) -> ArgP {
ArgP::NotContaining(val)
}
}
#[export_module]
#[allow(non_snake_case)]
pub(crate) mod TextPPascalModule {
use super::ArgP;
pub fn StartingWith(val: Dynamic) -> ArgP {
ArgP::StartingWith(val)
}
pub fn NotStartingWith(val: Dynamic) -> ArgP {
ArgP::NotStartingWith(val)
}
pub fn EndingWith(val: Dynamic) -> ArgP {
ArgP::EndingWith(val)
}
pub fn NotEndingWith(val: Dynamic) -> ArgP {
ArgP::NotEndingWith(val)
}
pub fn Containing(val: Dynamic) -> ArgP {
ArgP::Containing(val)
}
pub fn NotContaining(val: Dynamic) -> ArgP {
ArgP::NotContaining(val)
}
}