use serde::{Deserialize, Serialize};
use crate::column::Column;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Reference {
pub name: String,
pub target: String,
pub kind: ReferenceKind,
pub foreign_key: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub build_script: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContainedSpec {
pub name: String,
pub host_column: String,
pub kind: ContainedKind,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub columns: Vec<Column>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id_column: Option<String>,
}
impl ContainedSpec {
pub fn new(
name: impl Into<String>,
host_column: impl Into<String>,
kind: ContainedKind,
) -> Self {
Self {
name: name.into(),
host_column: host_column.into(),
kind,
columns: Vec::new(),
id_column: None,
}
}
pub fn with_columns(mut self, columns: Vec<Column>) -> Self {
self.columns = columns;
self
}
pub fn with_id_column(mut self, id_column: impl Into<String>) -> Self {
self.id_column = Some(id_column.into());
self
}
}
impl Reference {
pub fn new(
name: impl Into<String>,
target: impl Into<String>,
kind: ReferenceKind,
foreign_key: impl Into<String>,
) -> Self {
Self {
name: name.into(),
target: target.into(),
kind,
foreign_key: foreign_key.into(),
build_script: None,
}
}
pub fn with_build_script(mut self, script: impl Into<String>) -> Self {
self.build_script = Some(script.into());
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ReferenceKind {
#[default]
HasOne,
HasMany,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContainedKind {
#[default]
ContainsOne,
ContainsMany,
}