git.delta.rocks / jrsonnet / refs/heads / master

difftreelog

source

crates/jrsonnet-stdlib/src/encoding.rs1.2 KiBsourcehistory
1use base64::{Engine, engine::general_purpose::STANDARD};2use jrsonnet_evaluator::{3	IBytes, IStr, Result, bail, error,4	function::builtin,5	typed::{Either, Either2},6};78#[builtin]9pub fn builtin_encode_utf8(str: IStr) -> IBytes {10	str.cast_bytes()11}1213#[builtin]14pub fn builtin_decode_utf8(arr: IBytes, #[default(true)] lossy: bool) -> Result<IStr> {15	match arr.clone().cast_str() {16		Some(s) => Ok(s),17		None if lossy => Ok(String::from_utf8_lossy(arr.as_slice()).into()),18		None => {19			bail!("bad utf8")20		}21	}22}2324#[builtin]25pub fn builtin_base64(input: Either![IStr, IBytes]) -> String {26	use Either2::*;27	match input {28		A(l) => STANDARD.encode(l.as_bytes()),29		B(a) => STANDARD.encode(a.as_slice()),30	}31}3233#[builtin]34pub fn builtin_base64_decode_bytes(str: IStr) -> Result<IBytes> {35	Ok(STANDARD36		.decode(str.as_bytes())37		.map_err(|e| error!("invalid base64: {e}"))?38		.as_slice()39		.into())40}4142#[builtin]43pub fn builtin_base64_decode(str: IStr, #[default(false)] lossy: bool) -> Result<String> {44	let bytes = STANDARD45		.decode(str.as_bytes())46		.map_err(|e| error!("invalid base64: {e}"))?;47	if lossy {48		Ok(String::from_utf8_lossy(&bytes).to_string())49	} else {50		String::from_utf8(bytes).map_err(|e| error!("bad utf8: {e}"))51	}52}