wpl/eval/builtins/
base64.rs1use base64::{Engine as _, engine::general_purpose};
2use bytes::Bytes;
3use orion_error::compat_traits::ErrorOweBase;
4use orion_error::{ErrorWith, UvsFrom};
5use std::sync::Arc;
6
7use wp_model_core::raw::RawData;
8use wp_parse_api::{PipeProcessor, WparseReason, WparseResult};
9
10#[derive(Debug)]
11pub struct Base64Proc;
12
13impl PipeProcessor for Base64Proc {
14 fn process(&self, data: RawData) -> WparseResult<RawData> {
17 match data {
18 RawData::String(s) => {
19 let decoded = general_purpose::STANDARD
20 .decode(s.as_bytes())
21 .owe(WparseReason::from_data())
22 .doing("base64 decode")?;
23 let vstring = String::from_utf8(decoded)
24 .owe(WparseReason::from_data())
25 .doing("to-json")?;
26 Ok(RawData::from_string(vstring))
27 }
28 RawData::Bytes(b) => {
29 let decoded = general_purpose::STANDARD
30 .decode(b.as_ref())
31 .owe(WparseReason::from_data())
32 .doing("base64 decode")?;
33 Ok(RawData::Bytes(Bytes::from(decoded)))
34 }
35 RawData::ArcBytes(b) => {
36 let decoded = general_purpose::STANDARD
37 .decode(b.as_ref())
38 .owe(WparseReason::from_data())
39 .doing("base64 decode")?;
40 Ok(RawData::ArcBytes(Arc::new(decoded)))
42 }
43 }
44 }
45
46 fn name(&self) -> &'static str {
47 "decode/base64"
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use crate::parser::error::IntoWplCodeError;
54 use crate::parser::error::WplCodeResult;
55
56 use super::*;
57
58 #[test]
59 fn test_base64() -> WplCodeResult<()> {
60 let data = RawData::from_string("aGVsbG8=".to_string());
61 let y = Base64Proc.process(data).map_err(|e| e.into_wpl_err())?;
62 assert_eq!(crate::eval::builtins::raw_to_utf8_string(&y), "hello");
63
64 let data = RawData::from_string("VGhpcyBpcyBhIHRlc3Qgb2YgYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMhIEBfXyUgJiYqKys=".to_string());
66 let what = Base64Proc.process(data).map_err(|e| e.into_wpl_err())?;
67 let decoded = crate::eval::builtins::raw_to_utf8_string(&what);
68 assert!(decoded.starts_with(
69 "This is a test of a base64 encoded string with special characters! @__% &&*++"
70 ));
71
72 let bytes_data = RawData::Bytes(Bytes::from_static(b"aGVsbG8="));
73 let result = Base64Proc
74 .process(bytes_data)
75 .map_err(|e| e.into_wpl_err())?;
76 assert!(matches!(result, RawData::Bytes(_)));
77 assert_eq!(crate::eval::builtins::raw_to_utf8_string(&result), "hello");
78
79 let arc_data = RawData::ArcBytes(Arc::new(b"Zm9vYmFy".to_vec()));
80 let result = Base64Proc.process(arc_data).map_err(|e| e.into_wpl_err())?;
81 assert!(matches!(result, RawData::ArcBytes(_)));
82 assert_eq!(crate::eval::builtins::raw_to_utf8_string(&result), "foobar");
83 Ok(())
84 }
85}