Skip to main content

vespertide_core/schema/
foreign_key.rs

1use serde::{Deserialize, Serialize};
2
3use crate::schema::{names::ColumnName, names::TableName, reference::ReferenceAction};
4
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
6#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
7#[serde(rename_all = "snake_case")]
8pub struct ForeignKeyDef {
9    pub ref_table: TableName,
10    pub ref_columns: Vec<ColumnName>,
11    pub on_delete: Option<ReferenceAction>,
12    pub on_update: Option<ReferenceAction>,
13}
14
15/// Shorthand syntax for foreign key: { "references": "table.column", "on_delete": "cascade" }
16#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
17#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
18#[serde(rename_all = "snake_case")]
19pub struct ReferenceSyntaxDef {
20    /// Reference in "table.column" format
21    pub references: String,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub on_delete: Option<ReferenceAction>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub on_update: Option<ReferenceAction>,
26}
27
28#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
29#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
30#[serde(rename_all = "snake_case", untagged)]
31pub enum ForeignKeySyntax {
32    /// table.column
33    String(String),
34    /// { "references": "table.column", "on_delete": "cascade" }
35    Reference(ReferenceSyntaxDef),
36    /// { "ref_table": "table", "ref_columns": ["column"], ... }
37    Object(ForeignKeyDef),
38}