Skip to main content

xwrapup_parser/ds_node/
ds_root.rs

1use std::fmt::Debug;
2use std::ops::Deref;
3use syn::parse::{Parse, ParseStream};
4use syn::spanned::Spanned;
5
6use crate::ds_node::ds_attr::DsAttr;
7use crate::ds_node::node_enum::DsNode;
8use crate::ds_node::{DsTree, DsTreeRef};
9
10pub struct DsRoot {
11    parent: syn::Expr,
12    content: DsTreeRef,
13}
14
15impl DsRoot {
16    pub fn get_parent(&self) -> syn::Expr {
17        self.parent.clone()
18    }
19
20    pub fn get_content(&self) -> DsTreeRef {
21        self.content.clone()
22    }
23}
24
25impl Deref for DsRoot {
26    type Target = DsTreeRef;
27
28    fn deref(&self) -> &Self::Target {
29        &self.content
30    }
31}
32
33impl Debug for DsRoot {
34    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35        f.debug_struct("DsRoot")
36            .field("parent", &self.parent.span().unwrap())
37            .field("content", &self.content)
38            .finish()
39    }
40}
41
42impl Parse for DsRoot {
43    fn parse(input: ParseStream) -> syn::Result<Self> {
44        let err = syn::Error::new(input.span(), "Root node must have a parent");
45
46        if input.peek(syn::Token![:]) {
47            input.parse::<syn::Token![:]>()?;
48
49            let mut attrs = Vec::<DsAttr>::new();
50            let params;
51            syn::parenthesized!(params in input);
52            while !params.is_empty() {
53                attrs.push(params.parse()?);
54                if params.peek(syn::Token![:]) {
55                    params.parse::<syn::Token![:]>()?;
56                }
57            }
58
59            let parent_attr = attrs.iter().find(|attr| attr.name == "parent").ok_or(err)?;
60            let parent = parent_attr.value.clone();
61            let content = DsTree::parse(input)?.into_ref();
62            content.borrow_mut().set_parent(
63                DsTree {
64                    parent: None,
65                    node: DsNode::Root(parent.clone()),
66                    children: vec![],
67                }
68                .into_ref(),
69            );
70
71            Ok(DsRoot { parent, content })
72        } else {
73            Err(err)
74        }
75    }
76}