1mod arg;
2mod canister;
3mod data_store;
4mod def;
5mod entity;
6mod r#enum;
7mod field;
8mod index;
9mod index_store;
10mod item;
11mod list;
12mod map;
13mod newtype;
14mod primary_key;
15mod record;
16mod sanitizer;
17mod schema;
18mod set;
19mod tuple;
20mod r#type;
21mod validator;
22mod value;
23
24pub use self::arg::*;
25pub use self::canister::*;
26pub use self::data_store::*;
27pub use self::def::*;
28pub use self::entity::*;
29pub use self::r#enum::*;
30pub use self::field::*;
31pub use self::index::*;
32pub use self::index_store::*;
33pub use self::item::*;
34pub use self::list::*;
35pub use self::map::*;
36pub use self::newtype::*;
37pub use self::primary_key::*;
38pub use self::record::*;
39pub use self::sanitizer::*;
40pub use self::schema::*;
41pub use self::set::*;
42pub use self::tuple::*;
43pub use self::r#type::*;
44pub use self::validator::*;
45pub use self::value::*;
46
47use crate::{
48 prelude::*,
49 visit::{Event, Visitor},
50};
51use std::any::Any;
52use thiserror::Error as ThisError;
53
54#[derive(Debug, ThisError)]
59pub enum NodeError {
60 #[error("{0} is an incorrect node type")]
61 IncorrectNodeType(String),
62
63 #[error("path not found: {0}")]
64 PathNotFound(String),
65}
66
67pub trait MacroNode: Any {
78 fn as_any(&self) -> &dyn Any;
79}
80
81pub trait TypeNode: MacroNode {
87 fn ty(&self) -> &Type;
88}
89
90pub trait ValidateNode {
95 fn validate(&self) -> Result<(), ErrorTree> {
96 Ok(())
97 }
98}
99
100pub trait VisitableNode: ValidateNode {
105 fn route_key(&self) -> String {
107 String::new()
108 }
109
110 fn accept<V: Visitor>(&self, visitor: &mut V) {
112 visitor.push(&self.route_key());
113 visitor.visit(self, Event::Enter);
114 self.drive(visitor);
115 visitor.visit(self, Event::Exit);
116 visitor.pop();
117 }
118
119 fn drive<V: Visitor>(&self, _: &mut V) {}
121}