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