1use serde::{Serialize, de::DeserializeOwned};
2
3use crate::SettingsError;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct StoredValue(String);
7
8impl StoredValue {
9 pub fn encode<T: Serialize>(value: &T) -> Result<StoredValue, SettingsError> {
12 let encoding =
13 serde_json::to_string(value).map_err(|source| SettingsError::Serialize { source })?;
14 let sv = StoredValue(encoding);
15 Ok(sv)
16 }
17
18 pub fn decode<T: DeserializeOwned>(&self) -> Result<T, serde_json::Error> {
20 let v = serde_json::from_str(&self.0)?;
21 Ok(v)
22 }
23
24 pub fn as_str(&self) -> &str {
26 &self.0
27 }
28
29 pub fn from_raw(serialized: String) -> StoredValue {
33 StoredValue(serialized)
34 }
35}
36
37#[cfg(test)]
38mod test {
39
40 use super::*;
41
42 #[test]
43 fn test_encode_returns_sv_with_encoded_string() {
44 let sv_res = StoredValue::encode(&String::from("test"));
45 assert!(sv_res.is_ok());
46
47 let sv = sv_res.unwrap();
48 assert_eq!(sv.0, "\"test\"")
49 }
50
51 #[test]
52 fn test_encode_gracefully_handle_error() {
53 let test_str = "test";
54 let sv = StoredValue::encode(&test_str).unwrap();
55 let decoded_val: String = sv.decode().unwrap();
56
57 assert_eq!(decoded_val, test_str)
58 }
59
60 #[test]
61 fn test_as_str_returns_non_str_value_as_str() {
62 let test_val = 100;
63 let sv = StoredValue::encode(&test_val).unwrap();
64 let test_val_str = sv.as_str();
65
66 assert_eq!(test_val_str, test_val.to_string())
67 }
68}