Skip to main content

codama_nodes/value_nodes/
injected_value_node.rs

1use crate::{CamelCaseString, InjectedValueNode, ValueNode};
2
3impl InjectedValueNode {
4    pub fn new<T>(key: T) -> Self
5    where
6        T: Into<CamelCaseString>,
7    {
8        Self {
9            key: key.into(),
10            fallback: Box::new(None),
11        }
12    }
13
14    pub fn with_fallback<T, U>(key: T, fallback: U) -> Self
15    where
16        T: Into<CamelCaseString>,
17        U: Into<ValueNode>,
18    {
19        Self {
20            key: key.into(),
21            fallback: Box::new(Some(fallback.into())),
22        }
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use crate::NumberValueNode;
30
31    #[test]
32    fn new() {
33        let node = InjectedValueNode::new("my_key");
34        assert_eq!(node.key, CamelCaseString::new("myKey"));
35        assert_eq!(*node.fallback, None);
36    }
37
38    #[test]
39    fn with_fallback() {
40        let node = InjectedValueNode::with_fallback("my_key", NumberValueNode::new(42));
41        assert_eq!(node.key, CamelCaseString::new("myKey"));
42        assert_eq!(
43            *node.fallback,
44            Some(ValueNode::Number(NumberValueNode::new(42)))
45        );
46    }
47
48    #[test]
49    fn to_json() {
50        let node = InjectedValueNode::new("myKey");
51        let json = serde_json::to_string(&node).unwrap();
52        assert_eq!(json, r#"{"kind":"injectedValueNode","key":"myKey"}"#);
53    }
54
55    #[test]
56    fn from_json() {
57        let json = r#"{"kind":"injectedValueNode","key":"myKey"}"#;
58        let node: InjectedValueNode = serde_json::from_str(json).unwrap();
59        assert_eq!(node, InjectedValueNode::new("myKey"));
60    }
61
62    #[test]
63    fn to_json_with_fallback() {
64        let node = InjectedValueNode::with_fallback("myKey", NumberValueNode::new(42));
65        let json = serde_json::to_string(&node).unwrap();
66        assert_eq!(
67            json,
68            r#"{"kind":"injectedValueNode","key":"myKey","fallback":{"kind":"numberValueNode","number":42}}"#
69        );
70    }
71
72    #[test]
73    fn from_json_with_fallback() {
74        let json = r#"{"kind":"injectedValueNode","key":"myKey","fallback":{"kind":"numberValueNode","number":42}}"#;
75        let node: InjectedValueNode = serde_json::from_str(json).unwrap();
76        assert_eq!(
77            node,
78            InjectedValueNode::with_fallback("myKey", NumberValueNode::new(42u32))
79        );
80    }
81}