--- a/Cargo.lock +++ b/Cargo.lock @@ -108,6 +108,7 @@ name = "jrsonnet-evaluator" version = "1.0.0" dependencies = [ + "base64", "bincode", "closure", "indexmap", --- a/crates/jrsonnet-evaluator/Cargo.toml +++ b/crates/jrsonnet-evaluator/Cargo.toml @@ -24,6 +24,7 @@ jrsonnet-stdlib = { path = "../jrsonnet-stdlib", version = "1.0.0" } indexmap = "1.4.0" md5 = "0.7.0" +base64 = "0.12.3" serde = { version = "1.0.114", optional = true } bincode = { version = "1.3.1", optional = true } --- a/crates/jrsonnet-evaluator/build.rs +++ b/crates/jrsonnet-evaluator/build.rs @@ -35,7 +35,7 @@ Member::Field(FieldMember { name: FieldName::Fixed(name), .. - }) if **name == *"join" || **name == *"manifestJsonEx" || **name == *"escapeStringJson" || **name == *"equals" + }) if **name == *"join" || **name == *"manifestJsonEx" || **name == *"escapeStringJson" || **name == *"equals" || **name == *"base64" ) }) .collect(), --- a/crates/jrsonnet-evaluator/src/evaluate.rs +++ b/crates/jrsonnet-evaluator/src/evaluate.rs @@ -566,6 +566,22 @@ Ok(Val::Str(format!("{:x}", md5::compute(&str.as_bytes())).into())) }))?, // faster + ("std", "base64") => parse_args!(context, "std.base64", args, 1, [ + 0, input: [Val::Str | Val::Arr], vec![ValType::Arr, ValType::Str]; + ], { + Val::Str(match input { + Val::Str(s) => { + base64::encode(s.bytes().collect::>()).into() + }, + Val::Arr(a) => { + base64::encode(a.iter().map(|v| { + Ok(v.clone().try_cast_num("base64 array")? as u8) + }).collect::>>()?).into() + }, + _ => unreachable!() + }) + }), + // faster ("std", "join") => noinline!(parse_args!(context, "std.join", args, 2, [ 0, sep: [Val::Str|Val::Arr], vec![ValType::Str, ValType::Arr]; 1, arr: [Val::Arr]!!Val::Arr, vec![ValType::Arr];