codama_nodes/value_nodes/
constant_value_node.rs1use crate::{BytesEncoding, BytesTypeNode, BytesValueNode, TypeNode, ValueNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct ConstantValueNode {
6 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}