reflect/
node.rs

1use crate::{Accessor, Data, Ident, InvokeRef, MacroInvokeRef, Type, ValueRef};
2
3#[derive(Debug, Clone)]
4pub(crate) enum ValueNode {
5    Tuple(Vec<ValueRef>),
6    Str(String),
7    Reference(ValueRef),
8    ReferenceMut(ValueRef),
9    Dereference(ValueRef),
10    Binding {
11        name: Ident,
12        ty: Type,
13    },
14    DataStructure {
15        name: String,
16        data: Data<ValueRef>,
17    },
18    Invoke(InvokeRef),
19    Destructure {
20        parent: ValueRef,
21        accessor: Accessor,
22        ty: Type,
23    },
24    MacroInvocation(MacroInvokeRef),
25}
26
27impl ValueNode {
28    pub fn get_type_name(&self) -> Self {
29        match self {
30            ValueNode::Tuple(types) => {
31                let types: String = types.iter().fold(String::new(), |mut acc, v| {
32                    match &v.node().get_type_name() {
33                        ValueNode::Str(name) => {
34                            acc.push_str(name);
35                            acc.push_str(", ");
36                            acc
37                        }
38                        _ => unreachable!(),
39                    }
40                });
41                let types = format!("({})", types.trim_end_matches(", "));
42                ValueNode::Str(types)
43            }
44            ValueNode::Str(_) => ValueNode::Str(String::from("str")),
45            ValueNode::DataStructure { name, .. } => ValueNode::Str(name.clone()),
46            ValueNode::Reference(v) => v.node().get_type_name(),
47            ValueNode::ReferenceMut(v) => v.node().get_type_name(),
48            ValueNode::Binding { ty, .. } => ValueNode::Str(ty.0.get_name()),
49            ValueNode::Destructure {
50                parent,
51                accessor,
52                ty,
53            } => ValueNode::Str(ty.0.get_name()),
54            node => panic!("ValueNode::get_type_name"),
55        }
56    }
57}