Skip to main content

supabase_client_query/
table.rs

1use crate::sql::SqlParam;
2
3/// Trait for typed table mapping. Implemented by `#[derive(Table)]` or manually.
4///
5/// Provides metadata about the table structure and methods for binding values
6/// to SQL parameters for insert/update/primary-key operations.
7#[cfg(feature = "direct-sql")]
8pub trait Table: Sized + Send + Unpin + serde::de::DeserializeOwned + for<'r> sqlx::FromRow<'r, sqlx::postgres::PgRow> {
9    /// The database table name (e.g. "cities").
10    fn table_name() -> &'static str;
11
12    /// The schema name (defaults to "public").
13    fn schema_name() -> &'static str {
14        "public"
15    }
16
17    /// Primary key column names.
18    fn primary_key_columns() -> &'static [&'static str];
19
20    /// All column names (including primary key).
21    fn column_names() -> &'static [&'static str];
22
23    /// Columns that can be inserted (excludes auto-generated columns).
24    fn insertable_columns() -> &'static [&'static str];
25
26    /// Map a Rust field name to its database column name.
27    fn field_to_column(field: &str) -> Option<&'static str>;
28
29    /// Map a database column name to its Rust field name.
30    fn column_to_field(column: &str) -> Option<&'static str>;
31
32    /// Extract insert values as SqlParam in the order of `insertable_columns()`.
33    fn bind_insert(&self) -> Vec<SqlParam>;
34
35    /// Extract all non-primary-key values as SqlParam for UPDATE SET clauses.
36    fn bind_update(&self) -> Vec<SqlParam>;
37
38    /// Extract primary key values as SqlParam.
39    fn bind_primary_key(&self) -> Vec<SqlParam>;
40}
41
42/// Trait for typed table mapping (REST-only mode, no sqlx::FromRow required).
43#[cfg(not(feature = "direct-sql"))]
44pub trait Table: Sized + Send + serde::de::DeserializeOwned {
45    /// The database table name (e.g. "cities").
46    fn table_name() -> &'static str;
47
48    /// The schema name (defaults to "public").
49    fn schema_name() -> &'static str {
50        "public"
51    }
52
53    /// Primary key column names.
54    fn primary_key_columns() -> &'static [&'static str];
55
56    /// All column names (including primary key).
57    fn column_names() -> &'static [&'static str];
58
59    /// Columns that can be inserted (excludes auto-generated columns).
60    fn insertable_columns() -> &'static [&'static str];
61
62    /// Map a Rust field name to its database column name.
63    fn field_to_column(field: &str) -> Option<&'static str>;
64
65    /// Map a database column name to its Rust field name.
66    fn column_to_field(column: &str) -> Option<&'static str>;
67
68    /// Extract insert values as SqlParam in the order of `insertable_columns()`.
69    fn bind_insert(&self) -> Vec<SqlParam>;
70
71    /// Extract all non-primary-key values as SqlParam for UPDATE SET clauses.
72    fn bind_update(&self) -> Vec<SqlParam>;
73
74    /// Extract primary key values as SqlParam.
75    fn bind_primary_key(&self) -> Vec<SqlParam>;
76}