codama_nodes/link_nodes/
instruction_argument_link_node.rs

1use crate::{CamelCaseString, InstructionLinkNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct InstructionArgumentLinkNode {
6    // Data.
7    pub name: CamelCaseString,
8
9    // Children.
10    #[serde(skip_serializing_if = "crate::is_default")]
11    pub instruction: Option<InstructionLinkNode>,
12}
13
14impl From<InstructionArgumentLinkNode> for crate::Node {
15    fn from(val: InstructionArgumentLinkNode) -> Self {
16        crate::Node::Link(val.into())
17    }
18}
19
20impl InstructionArgumentLinkNode {
21    pub fn new<T>(name: T) -> Self
22    where
23        T: Into<CamelCaseString>,
24    {
25        Self {
26            name: name.into(),
27            instruction: None,
28        }
29    }
30
31    pub fn new_from_instruction<T>(name: T, instruction: InstructionLinkNode) -> Self
32    where
33        T: Into<CamelCaseString>,
34    {
35        Self {
36            name: name.into(),
37            instruction: Some(instruction),
38        }
39    }
40}
41
42impl From<String> for InstructionArgumentLinkNode {
43    fn from(name: String) -> Self {
44        Self::new(name)
45    }
46}
47
48impl From<&str> for InstructionArgumentLinkNode {
49    fn from(name: &str) -> Self {
50        Self::new(name)
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use crate::ProgramLinkNode;
57
58    use super::*;
59
60    #[test]
61    fn new() {
62        let node = InstructionArgumentLinkNode::new("my_instruction_argument");
63        assert_eq!(node.name, CamelCaseString::new("myInstructionArgument"));
64    }
65
66    #[test]
67    fn new_from_instruction() {
68        let node = InstructionArgumentLinkNode::new_from_instruction(
69            "my_instruction_argument",
70            InstructionLinkNode::new_from_program(
71                "my_instruction",
72                ProgramLinkNode::new("my_program"),
73            ),
74        );
75        assert_eq!(node.name, CamelCaseString::new("myInstructionArgument"));
76        assert_eq!(
77            node.instruction,
78            Some(InstructionLinkNode::new_from_program(
79                "myInstruction",
80                ProgramLinkNode::new("myProgram")
81            ))
82        );
83    }
84
85    #[test]
86    fn from_string() {
87        let node: InstructionArgumentLinkNode = String::from("my_instruction_argument").into();
88        assert_eq!(node.name, CamelCaseString::new("myInstructionArgument"));
89        assert_eq!(node.instruction, None);
90    }
91
92    #[test]
93    fn from_str() {
94        let node: InstructionArgumentLinkNode = "my_instruction_argument".into();
95        assert_eq!(node.name, CamelCaseString::new("myInstructionArgument"));
96        assert_eq!(node.instruction, None);
97    }
98
99    #[test]
100    fn to_json() {
101        let node = InstructionArgumentLinkNode::new("myArgument");
102        let json = serde_json::to_string(&node).unwrap();
103        assert_eq!(
104            json,
105            r#"{"kind":"instructionArgumentLinkNode","name":"myArgument"}"#
106        );
107    }
108
109    #[test]
110    fn from_json() {
111        let json = r#"{"kind":"instructionArgumentLinkNode","name":"myArgument"}"#;
112        let node: InstructionArgumentLinkNode = serde_json::from_str(json).unwrap();
113        assert_eq!(node, InstructionArgumentLinkNode::new("myArgument"));
114    }
115}