codama_nodes/link_nodes/
instruction_argument_link_node.rs1use crate::{CamelCaseString, InstructionLinkNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct InstructionArgumentLinkNode {
6 pub name: CamelCaseString,
8
9 #[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}