drizzle_core/traits/
table.rs1use crate::prelude::*;
2use crate::{SQL, SQLColumnInfo, SQLParam, SQLSchema, SQLSchemaType, ToSQL};
3use core::any::Any;
4
5pub trait SQLModel<'a, V: SQLParam>: ToSQL<'a, V> {
6 fn columns(&self) -> Box<[&'static dyn SQLColumnInfo]>;
7 fn values(&self) -> SQL<'a, V>;
8}
9
10pub trait SQLPartial<'a, Value: SQLParam> {
12 type Partial: SQLModel<'a, Value> + Default + 'a;
15
16 fn partial() -> Self::Partial {
17 Default::default()
18 }
19}
20
21pub trait SQLTable<'a, Type: SQLSchemaType, Value: SQLParam + 'a>:
22 SQLSchema<'a, Type, Value> + SQLTableInfo + Default + Clone
23{
24 type Select: SQLModel<'a, Value> + SQLPartial<'a, Value> + Default + 'a;
25
26 type Insert<T>: SQLModel<'a, Value> + Default;
29
30 type Update: SQLModel<'a, Value> + Default + 'a;
33
34 type Aliased: SQLTable<'a, Type, Value>;
37
38 fn alias(name: &'static str) -> Self::Aliased;
41}
42
43pub trait SQLTableInfo: Any + Send + Sync {
44 fn name(&self) -> &str;
45 fn columns(&self) -> Box<[&'static dyn SQLColumnInfo]>;
46
47 fn dependencies(&self) -> Box<[&'static dyn SQLTableInfo]> {
49 self.columns()
50 .iter()
51 .filter_map(|col| col.foreign_key())
52 .map(|fk_col| fk_col.table())
53 .collect()
54 }
55}
56
57impl core::fmt::Debug for dyn SQLTableInfo {
58 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
59 f.debug_struct("SQLTableInfo")
60 .field("name", &self.name())
61 .field("columns", &self.columns())
62 .finish()
63 }
64}
65
66pub trait AsTableInfo: Sized + SQLTableInfo {
67 fn as_table(&self) -> &dyn SQLTableInfo {
68 self
69 }
70}