codama_nodes/contextual_value_nodes/
resolver_value_node.rs

1use crate::{AccountValueNode, ArgumentValueNode, CamelCaseString, Docs, HasName};
2use codama_nodes_derive::{node, node_union};
3
4#[node]
5pub struct ResolverValueNode {
6    // Data.
7    pub name: CamelCaseString,
8    #[serde(default, skip_serializing_if = "crate::is_default")]
9    pub docs: Docs,
10
11    // Children.
12    #[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
41impl HasName for ResolverValueNode {
42    fn name(&self) -> &CamelCaseString {
43        &self.name
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50
51    #[test]
52    fn new() {
53        let node = ResolverValueNode::new("my_resolver");
54        assert_eq!(node.name, CamelCaseString::new("myResolver"));
55        assert_eq!(node.docs, Docs::default());
56        assert_eq!(node.depends_on, None);
57    }
58
59    #[test]
60    fn direct_instantiation() {
61        let node = ResolverValueNode {
62            name: "myResolver".into(),
63            docs: vec!["I am some resolver docs.".to_string()].into(),
64            depends_on: Some(vec![
65                AccountValueNode::new("myDependentAccount").into(),
66                ArgumentValueNode::new("myDependentArgument").into(),
67            ]),
68        };
69        assert_eq!(node.name, CamelCaseString::new("myResolver"));
70        assert_eq!(
71            node.docs,
72            Docs::from(vec!["I am some resolver docs.".to_string()])
73        );
74        assert_eq!(
75            node.depends_on,
76            Some(vec![
77                ResolverDependency::Account(AccountValueNode::new("myDependentAccount")),
78                ResolverDependency::Argument(ArgumentValueNode::new("myDependentArgument")),
79            ])
80        );
81    }
82
83    #[test]
84    fn to_json() {
85        let node = ResolverValueNode::new("myResolver");
86        let json = serde_json::to_string(&node).unwrap();
87        assert_eq!(json, r#"{"kind":"resolverValueNode","name":"myResolver"}"#);
88    }
89
90    #[test]
91    fn from_json() {
92        let json = r#"{"kind":"resolverValueNode","name":"myResolver"}"#;
93        let node: ResolverValueNode = serde_json::from_str(json).unwrap();
94        assert_eq!(node, ResolverValueNode::new("myResolver"));
95    }
96}