Skip to main content

icydb_schema/node/
mod.rs

1mod arg;
2mod canister;
3mod def;
4mod entity;
5mod r#enum;
6mod field;
7mod index;
8mod item;
9mod list;
10mod map;
11mod memory_id;
12mod newtype;
13mod primary_key;
14mod record;
15mod sanitizer;
16mod schema;
17mod set;
18mod store;
19mod tuple;
20mod r#type;
21mod validator;
22mod value;
23
24pub use self::arg::*;
25pub use self::canister::*;
26pub use self::def::*;
27pub use self::entity::*;
28pub use self::r#enum::*;
29pub use self::field::*;
30pub use self::index::*;
31pub use self::item::*;
32pub use self::list::*;
33pub use self::map::*;
34pub(crate) use self::memory_id::{validate_memory_id_in_range, validate_memory_id_not_reserved};
35pub use self::newtype::*;
36pub use self::primary_key::*;
37pub use self::record::*;
38pub use self::sanitizer::*;
39pub use self::schema::*;
40pub use self::set::*;
41pub use self::store::*;
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///
55/// NodeError
56///
57
58#[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
67///
68/// NODE TRAITS
69///
70
71///
72/// MacroNode
73/// shared traits for every node that is created via a macro
74/// as_any has to be implemented on each type manually
75///
76
77pub trait MacroNode: Any {
78    fn as_any(&self) -> &dyn Any;
79}
80
81///
82/// TypeNode
83/// shared traits for every type node
84///
85
86pub trait TypeNode: MacroNode {
87    fn ty(&self) -> &Type;
88}
89
90///
91/// ValidateNode
92///
93
94pub trait ValidateNode {
95    fn validate(&self) -> Result<(), ErrorTree> {
96        Ok(())
97    }
98}
99
100///
101/// VisitableNode
102///
103
104pub trait VisitableNode: ValidateNode {
105    // route_key
106    fn route_key(&self) -> String {
107        String::new()
108    }
109
110    // accept
111    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    // drive
120    fn drive<V: Visitor>(&self, _: &mut V) {}
121}