tank_core/writer/
context.rs

1#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
2pub enum Fragment {
3    #[default]
4    None,
5    ParameterBinding,
6    Casting,
7    Json,
8    JsonKey,
9    SqlCommentOnColumn,
10    SqlCreateSchema,
11    SqlCreateTable,
12    SqlCreateTablePrimaryKey,
13    SqlCreateTableUnique,
14    SqlDeleteFrom,
15    SqlDeleteFromWhere,
16    SqlDropSchema,
17    SqlDropTable,
18    SqlInsertInto,
19    SqlInsertIntoOnConflict,
20    SqlInsertIntoValues,
21    SqlJoin,
22    SqlSelect,
23    SqlSelectFrom,
24    SqlSelectOrderBy,
25    SqlSelectWhere,
26}
27
28#[derive(Debug, Clone, Copy, PartialEq, Eq)]
29pub struct Context {
30    pub counter: u32,
31    pub fragment: Fragment,
32    pub qualify_columns: bool,
33}
34
35impl Context {
36    pub const fn new(fragment: Fragment, qualify_columns: bool) -> Self {
37        Self {
38            counter: 0,
39            fragment,
40            qualify_columns,
41        }
42    }
43    pub const fn fragment(fragment: Fragment) -> Self {
44        Self {
45            counter: 0,
46            fragment,
47            qualify_columns: false,
48        }
49    }
50    pub const fn qualify(qualify_columns: bool) -> Self {
51        Self {
52            counter: 0,
53            fragment: Fragment::None,
54            qualify_columns,
55        }
56    }
57    pub const fn update_from(&mut self, context: &Context) {
58        self.counter = context.counter;
59    }
60    pub const fn switch_fragment<'s>(&'s mut self, fragment: Fragment) -> ContextUpdater<'s> {
61        ContextUpdater {
62            current: Context { fragment, ..*self },
63            previous: self,
64        }
65    }
66    pub fn is_inside_json(&self) -> bool {
67        self.fragment == Fragment::Json || self.fragment == Fragment::JsonKey
68    }
69}
70
71impl Default for Context {
72    fn default() -> Self {
73        Context::new(Fragment::None, true)
74    }
75}
76
77pub struct ContextUpdater<'a> {
78    pub current: Context,
79    pub previous: &'a mut Context,
80}
81
82impl<'a> Drop for ContextUpdater<'a> {
83    fn drop(&mut self) {
84        self.previous.counter = self.current.counter;
85    }
86}