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