vespertide_core/schema/
foreign_key.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use crate::schema::{names::ColumnName, names::TableName, reference::ReferenceAction};
5
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, 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, JsonSchema)]
17#[serde(rename_all = "snake_case")]
18pub struct ReferenceSyntaxDef {
19    /// Reference in "table.column" format
20    pub references: String,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub on_delete: Option<ReferenceAction>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub on_update: Option<ReferenceAction>,
25}
26
27#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
28#[serde(rename_all = "snake_case", untagged)]
29pub enum ForeignKeySyntax {
30    /// table.column
31    String(String),
32    /// { "references": "table.column", "on_delete": "cascade" }
33    Reference(ReferenceSyntaxDef),
34    /// { "ref_table": "table", "ref_columns": ["column"], ... }
35    Object(ForeignKeyDef),
36}