use super::Function;
use crate::codegen::cel::compiler::{CompileError, CompiledExpr, CompilerCtx};
#[derive(Debug, Clone, Default)]
pub(crate) struct Bool;
impl Function for Bool {
fn name(&self) -> &'static str {
"bool"
}
fn syntax(&self) -> &'static str {
"<this>.bool()"
}
fn compile(&self, mut ctx: CompilerCtx) -> Result<CompiledExpr, CompileError> {
let Some(this) = ctx.this.take() else {
return Err(CompileError::syntax("missing this", self));
};
if !ctx.args.is_empty() {
return Err(CompileError::syntax("takes no arguments", self));
}
Ok(this.into_bool(&ctx))
}
}
#[cfg(test)]
#[cfg(feature = "prost")]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use tinc_cel::CelValue;
use crate::codegen::cel::compiler::{CompiledExpr, Compiler, CompilerCtx};
use crate::codegen::cel::functions::{Bool, Function};
use crate::extern_paths::ExternPaths;
use crate::path_set::PathSet;
use crate::types::ProtoTypeRegistry;
#[test]
fn test_bool_syntax() {
let registry = ProtoTypeRegistry::new(crate::Mode::Prost, ExternPaths::new(crate::Mode::Prost), PathSet::default());
let compiler = Compiler::new(®istry);
insta::assert_debug_snapshot!(Bool.compile(CompilerCtx::new(compiler.child(), None, &[])), @r#"
Err(
InvalidSyntax {
message: "missing this",
syntax: "<this>.bool()",
},
)
"#);
insta::assert_debug_snapshot!(Bool.compile(CompilerCtx::new(compiler.child(), Some(CompiledExpr::constant(CelValue::List(Default::default()))), &[])), @r"
Ok(
Constant(
ConstantCompiledExpr {
value: Bool(
false,
),
},
),
)
");
insta::assert_debug_snapshot!(Bool.compile(CompilerCtx::new(compiler.child(), Some(CompiledExpr::constant(CelValue::List(Default::default()))), &[
cel_parser::parse("1 + 1").unwrap(), ])), @r#"
Err(
InvalidSyntax {
message: "takes no arguments",
syntax: "<this>.bool()",
},
)
"#);
}
}