codama_nodes/discriminator_nodes/
constant_discriminator_node.rs1use crate::ConstantValueNode;
2use codama_nodes_derive::node;
3
4#[node]
5pub struct ConstantDiscriminatorNode {
6 pub offset: usize,
8
9 pub constant: ConstantValueNode,
11}
12
13impl From<ConstantDiscriminatorNode> for crate::Node {
14 fn from(val: ConstantDiscriminatorNode) -> Self {
15 crate::Node::Discriminator(val.into())
16 }
17}
18
19impl ConstantDiscriminatorNode {
20 pub fn new<T>(constant: T, offset: usize) -> Self
21 where
22 T: Into<ConstantValueNode>,
23 {
24 Self {
25 constant: constant.into(),
26 offset,
27 }
28 }
29}
30
31#[cfg(test)]
32mod tests {
33 use crate::{Base16, NumberTypeNode, NumberValueNode, U32};
34
35 use super::*;
36
37 #[test]
38 fn new() {
39 let node = ConstantDiscriminatorNode::new(
40 ConstantValueNode::new(NumberTypeNode::le(U32), NumberValueNode::new(42u32)),
41 0,
42 );
43 assert_eq!(
44 node.constant,
45 ConstantValueNode::new(NumberTypeNode::le(U32), NumberValueNode::new(42u32))
46 );
47 assert_eq!(node.offset, 0);
48 }
49
50 #[test]
51 fn to_json() {
52 let node =
53 ConstantDiscriminatorNode::new(ConstantValueNode::bytes(Base16, "deadb0d1e5"), 0);
54 let json = serde_json::to_string(&node).unwrap();
55 assert_eq!(
56 json,
57 r#"{"kind":"constantDiscriminatorNode","offset":0,"constant":{"kind":"constantValueNode","type":{"kind":"bytesTypeNode"},"value":{"kind":"bytesValueNode","data":"deadb0d1e5","encoding":"base16"}}}"#
58 );
59 }
60
61 #[test]
62 fn from_json() {
63 let json = r#"{"kind":"constantDiscriminatorNode","offset":0,"constant":{"kind":"constantValueNode","type":{"kind":"bytesTypeNode"},"value":{"kind":"bytesValueNode","data":"deadb0d1e5","encoding":"base16"}}}"#;
64 let node: ConstantDiscriminatorNode = serde_json::from_str(json).unwrap();
65 assert_eq!(
66 node,
67 ConstantDiscriminatorNode::new(ConstantValueNode::bytes(Base16, "deadb0d1e5"), 0)
68 );
69 }
70}