tank_core/writer/
context.rs1#[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}