tank_core/writer/
context.rs

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