codama_nodes/discriminator_nodes/
constant_discriminator_node.rs

1use crate::ConstantValueNode;
2use codama_nodes_derive::node;
3
4#[node]
5pub struct ConstantDiscriminatorNode {
6    // Data.
7    pub offset: usize,
8
9    // Children.
10    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}