tank_core/writer/
context.rs

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