Skip to main content

attune_core/
value.rs

1use serde::{Serialize, de::DeserializeOwned};
2
3use crate::SettingsError;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct StoredValue(String);
7
8impl StoredValue {
9    /// Given a reference to a value of type T, return it as a StoredValue instance with the
10    /// original value JSON encoded.
11    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    // Decode StoredValue into its original value of type T.
19    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    // Converts a StoredValue to a String.
25    pub fn as_str(&self) -> &str {
26        &self.0
27    }
28
29    /// Wrap a raw, JSON-encoded string as a Stored Value. For use by backends
30    /// that read pre-serialized values from persistent storage. The caller is
31    /// responsible for ensuring the string is valid JSON.
32    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}