use serde::{Deserialize, Serialize};
use crate::schema::{
fk_orphan_strategy::ForeignKeyOrphanStrategy, names::ColumnName, names::TableName,
reference::ReferenceAction,
};
#[expect(
clippy::trivially_copy_pass_by_ref,
reason = "serde `skip_serializing_if` callbacks must have signature `fn(&T) -> bool`"
)]
fn is_default_fk_orphan_strategy(s: &ForeignKeyOrphanStrategy) -> bool {
matches!(s, ForeignKeyOrphanStrategy::NullifyOrphans)
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub struct ForeignKeyDef {
pub ref_table: TableName,
pub ref_columns: Vec<ColumnName>,
pub on_delete: Option<ReferenceAction>,
pub on_update: Option<ReferenceAction>,
#[serde(default, skip_serializing_if = "is_default_fk_orphan_strategy")]
pub orphan_strategy: ForeignKeyOrphanStrategy,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub struct ReferenceSyntaxDef {
pub references: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub on_delete: Option<ReferenceAction>,
#[serde(skip_serializing_if = "Option::is_none")]
pub on_update: Option<ReferenceAction>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case", untagged)]
pub enum ForeignKeySyntax {
String(String),
Reference(ReferenceSyntaxDef),
Object(ForeignKeyDef),
}