codama_nodes/count_nodes/
prefixed_count_node.rs1use crate::{NestedTypeNode, NumberTypeNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct PrefixedCountNode {
6 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}