filterx_engine 0.4.1

The engine library for filterx
Documentation
#[macro_export]
macro_rules! eval {
    ($vm:expr, $target:expr, $msg:literal, $($expr:ident),*) => {
        match $target {
            $(
                ast::Expr::$expr(x) => x.eval($vm)?,
            )*
            _ => {
                $vm.hint.white($msg).print_and_exit();
            }
        }
    };
    ($vm:expr, $target:expr, $msg:expr, $($expr:ident),*) => {
        match $target {
            $(
                ast::Expr::$expr(x) => x.eval($vm)?,
            )*
            _ => {
                $msg.print_and_exit()
            }
        }
    };
}

#[macro_export]
macro_rules! eval_col {
    ($vm:expr, $target:expr, $msg:literal) => {
        eval!($vm, $target, $msg, Name, Call, Constant, UnaryOp)
    };
    ($vm:expr, $target:expr, $msg:literal,) => {
        eval!($vm, $target, $msg, Name, Call, Constant, UnaryOp)
    };
}

#[macro_export]
macro_rules! eval_int {
    ($vm:expr, $target:expr, $msg:literal) => {
        eval!($vm, $target, $msg, Constant, UnaryOp, BinOp)
    };
    ($vm:expr, $target:expr, $msg:literal,) => {
        eval!($vm, $target, $msg, Constant, UnaryOp, BinOp)
    };
}

#[macro_export]
macro_rules! eval_str {
    ($vm:expr, $target:expr, $msg:literal) => {
        eval!($vm, $target, $msg, Constant)
    };
    ($vm:expr, $target:expr, $msg:literal,) => {
        eval!($vm, $target, $msg, Constant)
    };
}

#[macro_export]
macro_rules! builtin_function {
    (   $group: ident,
        $(
            ($name:ident, $expression:expr, $inplace:expr $(, ($($alias:ident),*))?),
        )*
    ) => {
        pub use crate::eval::call::BuiltinFunction;
        pub static $group: &'static [BuiltinFunction] = &[
            $(

                BuiltinFunction {
                    name: stringify!($name),
                    alias: &[stringify!($name), $(
                        $(stringify!($alias)),*
                    )?],
                    can_expression: $expression,
                    can_inplace: $inplace,
                    doc: include_str!(concat!("doc/", stringify!($name), ".md")),
                },
            )*
        ];
        $(
            pub mod $name;
            pub use $name::$name;
        )*
    };
}

#[macro_export]
macro_rules! execuable {
    ($vm:expr, $target: expr) => {
        use crate::vm::VmMode;
        if $vm.mode == VmMode::Print {
            let h = &mut $vm.hint;
            h.white("Con't use ")
                .red($target)
                .white(" in builtin function")
                .green(" `print`.")
                .print_and_exit()
        }
    };
}