codama_nodes/contextual_value_nodes/
resolver_value_node.rs

1use crate::{AccountValueNode, ArgumentValueNode, CamelCaseString, Docs};
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
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}