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}