codama_nodes/count_nodes/
prefixed_count_node.rs

1use crate::{NestedTypeNode, NumberTypeNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct PrefixedCountNode {
6    // Data.
7    pub prefix: NestedTypeNode<NumberTypeNode>,
8}
9
10impl From<PrefixedCountNode> for crate::Node {
11    fn from(val: PrefixedCountNode) -> Self {
12        crate::Node::Count(val.into())
13    }
14}
15
16impl PrefixedCountNode {
17    pub fn new<T>(prefix: T) -> Self
18    where
19        T: Into<NestedTypeNode<NumberTypeNode>>,
20    {
21        Self {
22            prefix: prefix.into(),
23        }
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30    use crate::{Endian, NestedTypeNodeTrait, PreOffsetTypeNode, U32};
31
32    #[test]
33    fn new() {
34        let node = PrefixedCountNode::new(NumberTypeNode::le(U32));
35        assert_eq!(
36            node.prefix,
37            NestedTypeNode::Value(NumberTypeNode::new(U32, Endian::Little))
38        );
39        assert_eq!(
40            node.prefix.get_nested_type_node(),
41            &NumberTypeNode::new(U32, Endian::Little)
42        );
43    }
44
45    #[test]
46    fn new_with_nested_prefix() {
47        let node = PrefixedCountNode::new(PreOffsetTypeNode::absolute(NumberTypeNode::le(U32), 0));
48        assert_eq!(
49            node.prefix,
50            NestedTypeNode::PreOffset(PreOffsetTypeNode::absolute(
51                NestedTypeNode::Value(NumberTypeNode::new(U32, Endian::Little)),
52                0
53            ))
54        );
55        assert_eq!(
56            node.prefix.get_nested_type_node(),
57            &NumberTypeNode::new(U32, Endian::Little)
58        );
59    }
60
61    #[test]
62    fn to_json() {
63        let node = PrefixedCountNode::new(NumberTypeNode::le(U32));
64        let json = serde_json::to_string(&node).unwrap();
65        assert_eq!(
66            json,
67            r#"{"kind":"prefixedCountNode","prefix":{"kind":"numberTypeNode","format":"u32","endian":"le"}}"#
68        );
69    }
70
71    #[test]
72    fn from_json() {
73        let json = r#"{"kind":"prefixedCountNode","prefix":{"kind":"numberTypeNode","format":"u32","endian":"le"}}"#;
74        let node: PrefixedCountNode = serde_json::from_str(json).unwrap();
75        assert_eq!(node, PrefixedCountNode::new(NumberTypeNode::le(U32)));
76    }
77}