vrl/stdlib/
encode_base16.rs1use crate::compiler::prelude::*;
2
3fn encode_base16(value: Value) -> Resolved {
4 let value = value.try_bytes()?;
5 Ok(base16::encode_lower(&value).into())
6}
7
8#[derive(Clone, Copy, Debug)]
9pub struct EncodeBase16;
10
11impl Function for EncodeBase16 {
12 fn identifier(&self) -> &'static str {
13 "encode_base16"
14 }
15
16 fn usage(&self) -> &'static str {
17 "Encodes the `value` to [Base16](https://en.wikipedia.org/wiki/Hexadecimal)."
18 }
19
20 fn category(&self) -> &'static str {
21 Category::Codec.as_ref()
22 }
23
24 fn return_kind(&self) -> u16 {
25 kind::BYTES
26 }
27
28 fn parameters(&self) -> &'static [Parameter] {
29 const PARAMETERS: &[Parameter] = &[Parameter::required(
30 "value",
31 kind::BYTES,
32 "The string to encode.",
33 )];
34 PARAMETERS
35 }
36
37 fn compile(
38 &self,
39 _state: &state::TypeState,
40 _ctx: &mut FunctionCompileContext,
41 arguments: ArgumentList,
42 ) -> Compiled {
43 let value = arguments.required("value");
44
45 Ok(EncodeBase16Fn { value }.as_expr())
46 }
47
48 fn examples(&self) -> &'static [Example] {
49 &[example! {
50 title: "Encode to Base16",
51 source: r#"encode_base16("some string value")"#,
52 result: Ok("736f6d6520737472696e672076616c7565"),
53 }]
54 }
55}
56
57#[derive(Clone, Debug)]
58struct EncodeBase16Fn {
59 value: Box<dyn Expression>,
60}
61
62impl FunctionExpression for EncodeBase16Fn {
63 fn resolve(&self, ctx: &mut Context) -> Resolved {
64 let value = self.value.resolve(ctx)?;
65
66 encode_base16(value)
67 }
68
69 fn type_def(&self, _: &state::TypeState) -> TypeDef {
70 TypeDef::bytes().infallible()
71 }
72}
73
74#[cfg(test)]
75mod test {
76 use super::*;
77 use crate::value;
78
79 test_function![
80 encode_base16 => EncodeBase16;
81
82 with_defaults {
83 args: func_args![value: value!("some+=string/value")],
84 want: Ok(value!("736f6d652b3d737472696e672f76616c7565")),
85 tdef: TypeDef::bytes().infallible(),
86 }
87
88 ];
89}