use serde::{Deserialize, Deserializer, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AutoIncrementKind {
Serial,
IdentityAlways,
IdentityByDefault,
Legacy,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AutoIncrementOwner {
pub table: String,
pub column: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AutoIncrement {
pub kind: AutoIncrementKind,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sequence: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub owner: Option<AutoIncrementOwner>,
}
impl AutoIncrement {
#[must_use]
pub const fn serial() -> Self {
Self {
kind: AutoIncrementKind::Serial,
sequence: None,
owner: None,
}
}
#[must_use]
pub const fn identity_always() -> Self {
Self {
kind: AutoIncrementKind::IdentityAlways,
sequence: None,
owner: None,
}
}
#[must_use]
pub const fn identity_by_default() -> Self {
Self {
kind: AutoIncrementKind::IdentityByDefault,
sequence: None,
owner: None,
}
}
#[must_use]
pub const fn legacy() -> Self {
Self {
kind: AutoIncrementKind::Legacy,
sequence: None,
owner: None,
}
}
#[must_use]
pub const fn is_identity(&self) -> bool {
matches!(
self.kind,
AutoIncrementKind::IdentityAlways | AutoIncrementKind::IdentityByDefault
)
}
#[must_use]
pub const fn is_legacy(&self) -> bool {
matches!(self.kind, AutoIncrementKind::Legacy)
}
}
pub(super) fn deserialize_auto_increment<'de, D>(
deserializer: D,
) -> Result<Option<AutoIncrement>, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum Representation {
Legacy(bool),
Provenance(AutoIncrement),
}
Ok(match Option::<Representation>::deserialize(deserializer)? {
Some(Representation::Legacy(true)) => Some(AutoIncrement::legacy()),
Some(Representation::Legacy(false)) | None => None,
Some(Representation::Provenance(provenance)) => Some(provenance),
})
}