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/// Reference to a table (schema-qualified + optional alias).
10#[derive(Default, Clone, PartialEq, Eq, Debug)]
11pub struct TableRef {
12    /// Table name.
13    pub name: &'static str,
14    /// Schema name.
15    pub schema: &'static str,
16    /// Optional alias used when rendering.
17    pub alias: Cow<'static, str>,
18}
19
20impl TableRef {
21    pub fn full_name(&self) -> String {
22        let mut result = String::new();
23        if !self.alias.is_empty() {
24            result.push_str(&self.alias);
25        } else {
26            if !self.schema.is_empty() {
27                result.push_str(&self.schema);
28                result.push('.');
29            }
30            result.push_str(&self.name);
31        }
32        result
33    }
34    pub fn with_alias(&self, alias: Cow<'static, str>) -> Self {
35        let mut result = self.clone();
36        result.alias = alias.into();
37        result
38    }
39}
40
41impl DataSet for TableRef {
42    fn qualified_columns() -> bool
43    where
44        Self: Sized,
45    {
46        false
47    }
48    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, out: &mut String) {
49        writer.write_table_ref(context, out, self)
50    }
51}
52
53impl DataSet for &TableRef {
54    fn qualified_columns() -> bool
55    where
56        Self: Sized,
57    {
58        false
59    }
60    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, out: &mut String) {
61        (*writer).write_table_ref(context, out, self)
62    }
63}
64
65impl ToTokens for TableRef {
66    fn to_tokens(&self, tokens: &mut TokenStream) {
67        let name = &self.name;
68        let schema = &self.schema;
69        let alias = quote_cow(&self.alias);
70        tokens.append_all(quote! {
71            ::tank::ColumnRef {
72                name: #name,
73                schema: #schema,
74                alias: #alias,
75            }
76        });
77    }
78}
79
80/// Wrapper used when declaring table references in generated macros.
81#[derive(Default, Clone, PartialEq, Eq, Debug)]
82pub struct DeclareTableRef(pub TableRef);
83
84impl DataSet for DeclareTableRef {
85    fn qualified_columns() -> bool
86    where
87        Self: Sized,
88    {
89        false
90    }
91    fn write_query(&self, writer: &dyn SqlWriter, context: &mut Context, out: &mut String) {
92        writer.write_table_ref(context, out, &self.0)
93    }
94}
95
96impl ToTokens for DeclareTableRef {
97    fn to_tokens(&self, tokens: &mut TokenStream) {
98        let table_ref = &self.0;
99        tokens.append_all(quote!(::tank::DeclareTableRef(#table_ref)));
100    }
101}