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_binary, compile_call_unary},
};
pub fn compile_k8s_semver_function(
func_name: &str,
call_expr: &CallExpr,
body: &mut InstrSeqBuilder,
env: &CompilerEnv,
ctx: &CompilerContext,
module: &mut walrus::Module,
) -> Result<(), anyhow::Error> {
match func_name {
"isSemver" => {
let n_args = if call_expr.target.is_some() {
call_expr.args.len() + 1 } else {
call_expr.args.len()
};
if n_args == 1 {
compile_call_unary(
call_expr,
func_name,
RuntimeFunction::K8sSemverIsSemver,
body,
env,
ctx,
module,
)
} else if n_args == 2 {
compile_call_binary(
call_expr,
func_name,
RuntimeFunction::K8sSemverIsSemverNormalize,
body,
env,
ctx,
module,
)
} else {
anyhow::bail!("isSemver() expects 1 or 2 arguments, got {}", n_args)
}
}
"semver" => {
let n_args = if call_expr.target.is_some() {
call_expr.args.len() + 1
} else {
call_expr.args.len()
};
if n_args == 1 {
compile_call_unary(
call_expr,
func_name,
RuntimeFunction::K8sSemverParse,
body,
env,
ctx,
module,
)
} else if n_args == 2 {
if call_expr.target.is_none() && call_expr.args.len() == 2 {
compile_expr(&call_expr.args[0].expr, body, env, ctx, module)?;
compile_expr(&call_expr.args[1].expr, body, env, ctx, module)?;
body.call(env.get(RuntimeFunction::K8sSemverParseNormalize));
Ok(())
} else {
anyhow::bail!("semver(str, bool) must be called as a function, not a method")
}
} else {
anyhow::bail!("semver() expects 1 or 2 arguments, got {}", n_args)
}
}
"major" => compile_call_unary(
call_expr,
func_name,
RuntimeFunction::K8sSemverMajor,
body,
env,
ctx,
module,
),
"minor" => compile_call_unary(
call_expr,
func_name,
RuntimeFunction::K8sSemverMinor,
body,
env,
ctx,
module,
),
"patch" => compile_call_unary(
call_expr,
func_name,
RuntimeFunction::K8sSemverPatch,
body,
env,
ctx,
module,
),
"isLessThan" => compile_call_binary(
call_expr,
func_name,
RuntimeFunction::K8sSemverIsLessThan,
body,
env,
ctx,
module,
),
"isGreaterThan" => compile_call_binary(
call_expr,
func_name,
RuntimeFunction::K8sSemverIsGreaterThan,
body,
env,
ctx,
module,
),
"compareTo" => compile_call_binary(
call_expr,
func_name,
RuntimeFunction::K8sSemverCompareTo,
body,
env,
ctx,
module,
),
_ => anyhow::bail!("Unknown Kubernetes semver function: {}", func_name),
}
}