use super::ModelDescriptor;
use crate::{SqlColumnValue, SqlValue};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CreateDefaultType {
Bool,
Int,
BigInt,
String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CreateDefault {
pub column: &'static str,
pub auth_field: &'static str,
pub ty: CreateDefaultType,
pub nullable: bool,
pub auth_field_required: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GeneratedValue {
Now,
Uuid,
UuidText,
Cuid,
}
impl GeneratedValue {
pub fn generate(self) -> SqlValue {
match self {
Self::Now => SqlValue::DateTime(chrono::Utc::now()),
Self::Uuid => SqlValue::Uuid(uuid::Uuid::new_v4()),
Self::UuidText => SqlValue::String(uuid::Uuid::new_v4().hyphenated().to_string()),
Self::Cuid => SqlValue::String(cratestack_core::cuid::new_cuid()),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct GeneratedDefault {
pub column: &'static str,
pub value: GeneratedValue,
}
impl<M, PK> ModelDescriptor<M, PK> {
pub const fn with_generated_defaults(
self,
generated_defaults: &'static [GeneratedDefault],
) -> Self {
Self {
generated_defaults,
..self
}
}
pub fn fill_generated_defaults(&self, values: &mut Vec<SqlColumnValue>) {
for default in self.generated_defaults {
if values.iter().all(|value| value.column != default.column) {
values.push(SqlColumnValue {
column: default.column,
value: default.value.generate(),
});
}
}
}
}