codama_nodes/contextual_value_nodes/
resolver_value_node.rs1use crate::{AccountValueNode, ArgumentValueNode, CamelCaseString, Docs};
2use codama_nodes_derive::{node, node_union};
3
4#[node]
5pub struct ResolverValueNode {
6 pub name: CamelCaseString,
8 #[serde(default, skip_serializing_if = "crate::is_default")]
9 pub docs: Docs,
10
11 #[serde(skip_serializing_if = "crate::is_default")]
13 pub depends_on: Option<Vec<ResolverDependency>>,
14}
15
16impl From<ResolverValueNode> for crate::Node {
17 fn from(val: ResolverValueNode) -> Self {
18 crate::Node::ContextualValue(val.into())
19 }
20}
21
22impl ResolverValueNode {
23 pub fn new<T>(name: T) -> Self
24 where
25 T: Into<CamelCaseString>,
26 {
27 Self {
28 name: name.into(),
29 docs: Docs::default(),
30 depends_on: None,
31 }
32 }
33}
34
35#[node_union]
36pub enum ResolverDependency {
37 Account(AccountValueNode),
38 Argument(ArgumentValueNode),
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44
45 #[test]
46 fn new() {
47 let node = ResolverValueNode::new("my_resolver");
48 assert_eq!(node.name, CamelCaseString::new("myResolver"));
49 assert_eq!(node.docs, Docs::default());
50 assert_eq!(node.depends_on, None);
51 }
52
53 #[test]
54 fn direct_instantiation() {
55 let node = ResolverValueNode {
56 name: "myResolver".into(),
57 docs: vec!["I am some resolver docs.".to_string()].into(),
58 depends_on: Some(vec![
59 AccountValueNode::new("myDependentAccount").into(),
60 ArgumentValueNode::new("myDependentArgument").into(),
61 ]),
62 };
63 assert_eq!(node.name, CamelCaseString::new("myResolver"));
64 assert_eq!(
65 node.docs,
66 Docs::from(vec!["I am some resolver docs.".to_string()])
67 );
68 assert_eq!(
69 node.depends_on,
70 Some(vec![
71 ResolverDependency::Account(AccountValueNode::new("myDependentAccount")),
72 ResolverDependency::Argument(ArgumentValueNode::new("myDependentArgument")),
73 ])
74 );
75 }
76
77 #[test]
78 fn to_json() {
79 let node = ResolverValueNode::new("myResolver");
80 let json = serde_json::to_string(&node).unwrap();
81 assert_eq!(json, r#"{"kind":"resolverValueNode","name":"myResolver"}"#);
82 }
83
84 #[test]
85 fn from_json() {
86 let json = r#"{"kind":"resolverValueNode","name":"myResolver"}"#;
87 let node: ResolverValueNode = serde_json::from_str(json).unwrap();
88 assert_eq!(node, ResolverValueNode::new("myResolver"));
89 }
90}