vrl/stdlib/
encode_base16.rs

1use 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}