1use base64::{engine::general_purpose::STANDARD, Engine};2use jrsonnet_evaluator::{3 function::builtin,4 runtime_error,5 typed::{Either, Either2},6 IBytes, IStr, Result,7};89#[builtin]10pub fn builtin_encode_utf8(str: IStr) -> IBytes {11 str.cast_bytes()12}1314#[builtin]15pub fn builtin_decode_utf8(arr: IBytes) -> Result<IStr> {16 arr.cast_str().ok_or_else(|| runtime_error!("bad utf8"))17}1819#[builtin]20pub fn builtin_base64(input: Either![IStr, IBytes]) -> String {21 use Either2::*;22 match input {23 A(l) => STANDARD.encode(l.as_bytes()),24 B(a) => STANDARD.encode(a.as_slice()),25 }26}2728#[builtin]29pub fn builtin_base64_decode_bytes(str: IStr) -> Result<IBytes> {30 Ok(STANDARD31 .decode(str.as_bytes())32 .map_err(|e| runtime_error!("invalid base64: {e}"))?33 .as_slice()34 .into())35}3637#[builtin]38pub fn builtin_base64_decode(str: IStr) -> Result<String> {39 let bytes = STANDARD40 .decode(str.as_bytes())41 .map_err(|e| runtime_error!("invalid base64: {e}"))?;42 String::from_utf8(bytes).map_err(|_| runtime_error!("bad utf8"))43}