tank_core/
table_ref.rs

1use crate::{
2    DataSet, quote_cow,
3    writer::{Context, SqlWriter},
4};
5use proc_macro2::TokenStream;
6use quote::{ToTokens, TokenStreamExt, quote};
7use std::borrow::Cow;
8
9#[derive(Default, Clone, PartialEq, Eq, Debug)]
10pub struct TableRef {
11    pub name: &'static str,
12    pub schema: &'static str,
13    pub alias: Cow<'static, str>,
14}
15
16impl TableRef {
17    pub fn full_name(&self) -> String {
18        let mut result = String::new();
19        if !self.alias.is_empty() {
20            result.push_str(&self.alias);
21        } else {
22            if !self.schema.is_empty() {
23                result.push_str(&self.schema);
24                result.push('.');
25            }
26            result.push_str(&self.name);
27        }
28        result
29    }
30    pub fn with_alias(&self, alias: Cow<'static, str>) -> Self {
31        let mut result = self.clone();
32        result.alias = alias.into();
33        result
34    }
35}
36
37impl DataSet for TableRef {
38    fn qualified_columns() -> bool
39    where
40        Self: Sized,
41    {
42        false
43    }
44    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, buff: &mut String) {
45        writer.write_table_ref(context, buff, self)
46    }
47}
48
49impl DataSet for &TableRef {
50    fn qualified_columns() -> bool
51    where
52        Self: Sized,
53    {
54        false
55    }
56    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, buff: &mut String) {
57        (*writer).write_table_ref(context, buff, self)
58    }
59}
60
61impl ToTokens for TableRef {
62    fn to_tokens(&self, tokens: &mut TokenStream) {
63        let name = &self.name;
64        let schema = &self.schema;
65        let alias = quote_cow(&self.alias);
66        tokens.append_all(quote! {
67            ::tank::ColumnRef {
68                name: #name,
69                schema: #schema,
70                alias: #alias,
71            }
72        });
73    }
74}
75
76#[derive(Default, Clone, PartialEq, Eq, Debug)]
77pub struct DeclareTableRef(pub TableRef);
78
79impl DataSet for DeclareTableRef {
80    fn qualified_columns() -> bool
81    where
82        Self: Sized,
83    {
84        false
85    }
86    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, buff: &mut String) {
87        writer.write_table_ref(context, buff, &self.0)
88    }
89}
90
91impl ToTokens for DeclareTableRef {
92    fn to_tokens(&self, tokens: &mut TokenStream) {
93        let table_ref = &self.0;
94        tokens.append_all(quote!(::tank::DeclareTableRef(#table_ref)));
95    }
96}