use cel::common::ast::CallExpr;
use ferricel_types::functions::RuntimeFunction;
use walrus::InstrSeqBuilder;
use crate::compiler::{
context::{CompilerContext, CompilerEnv},
expr::compile_expr,
helpers::compile_call_unary,
};
pub fn compile_k8s_ip_function(
func_name: &str,
call_expr: &CallExpr,
body: &mut InstrSeqBuilder,
env: &CompilerEnv,
ctx: &CompilerContext,
module: &mut walrus::Module,
) -> Result<(), anyhow::Error> {
if func_name == "isCanonical" {
match &call_expr.target {
Some(_) => {
if call_expr.args.len() != 1 {
anyhow::bail!("ip.isCanonical() expects 1 argument");
}
compile_expr(&call_expr.args[0].expr, body, env, ctx, module)?;
}
None => {
if call_expr.args.len() != 1 {
anyhow::bail!("isCanonical() expects 1 argument");
}
compile_expr(&call_expr.args[0].expr, body, env, ctx, module)?;
}
}
body.call(env.get(RuntimeFunction::K8sIpIsCanonical));
return Ok(());
}
let runtime_fn = match func_name {
"ip" => RuntimeFunction::K8sIpParse,
"isIP" => RuntimeFunction::K8sIsIp,
"family" => RuntimeFunction::K8sIpFamily,
"isUnspecified" => RuntimeFunction::K8sIpIsUnspecified,
"isLoopback" => RuntimeFunction::K8sIpIsLoopback,
"isLinkLocalMulticast" => RuntimeFunction::K8sIpIsLinkLocalMulticast,
"isLinkLocalUnicast" => RuntimeFunction::K8sIpIsLinkLocalUnicast,
"isGlobalUnicast" => RuntimeFunction::K8sIpIsGlobalUnicast,
_ => anyhow::bail!("Unknown Kubernetes IP function: {}", func_name),
};
compile_call_unary(call_expr, func_name, runtime_fn, body, env, ctx, module)
}