codama_nodes/value_nodes/
constant_value_node.rs

1use crate::{BytesEncoding, BytesTypeNode, BytesValueNode, TypeNode, ValueNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct ConstantValueNode {
6    // Children.
7    pub r#type: Box<TypeNode>,
8    pub value: Box<ValueNode>,
9}
10
11impl From<ConstantValueNode> for crate::Node {
12    fn from(val: ConstantValueNode) -> Self {
13        crate::Node::Value(val.into())
14    }
15}
16
17impl ConstantValueNode {
18    pub fn new<T, U>(r#type: T, value: U) -> Self
19    where
20        T: Into<TypeNode>,
21        U: Into<ValueNode>,
22    {
23        Self {
24            r#type: Box::new(r#type.into()),
25            value: Box::new(value.into()),
26        }
27    }
28
29    pub fn bytes<T>(encoding: BytesEncoding, data: T) -> Self
30    where
31        T: Into<String>,
32    {
33        Self {
34            r#type: Box::new(BytesTypeNode::new().into()),
35            value: Box::new(BytesValueNode::new(encoding, data).into()),
36        }
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43    use crate::{Base16, NumberTypeNode, NumberValueNode, U64};
44
45    #[test]
46    fn new() {
47        let node = ConstantValueNode::new(NumberTypeNode::le(U64), NumberValueNode::new(42u64));
48        assert_eq!(*node.r#type, TypeNode::Number(NumberTypeNode::le(U64)));
49        assert_eq!(*node.value, ValueNode::Number(NumberValueNode::new(42u64)));
50    }
51
52    #[test]
53    fn bytes() {
54        let node = ConstantValueNode::bytes(Base16, "deadb0d1e5");
55        assert_eq!(*node.r#type, TypeNode::Bytes(BytesTypeNode::new()));
56        assert_eq!(
57            *node.value,
58            ValueNode::Bytes(BytesValueNode::base16("deadb0d1e5"))
59        );
60    }
61
62    #[test]
63    fn to_json() {
64        let node = ConstantValueNode::bytes(Base16, "deadb0d1e5");
65        let json = serde_json::to_string(&node).unwrap();
66        assert_eq!(
67            json,
68            r#"{"kind":"constantValueNode","type":{"kind":"bytesTypeNode"},"value":{"kind":"bytesValueNode","data":"deadb0d1e5","encoding":"base16"}}"#
69        );
70    }
71
72    #[test]
73    fn from_json() {
74        let json = r#"{"kind":"constantValueNode","type":{"kind":"bytesTypeNode"},"value":{"kind":"bytesValueNode","data":"deadb0d1e5","encoding":"base16"}}"#;
75        let node: ConstantValueNode = serde_json::from_str(json).unwrap();
76        assert_eq!(node, ConstantValueNode::bytes(Base16, "deadb0d1e5"));
77    }
78}