xwrapup_parser/ds_node/
ds_root.rs1use 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}