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