use cratestack_core::schema::default_functions::BuiltinDefault;
use super::ModelDescriptor;
use super::defaults::GeneratedValue;
use crate::{SqlColumnValue, SqlValue};
#[derive(Clone, Copy)]
pub struct LiteralDefault {
pub column: &'static str,
pub value: fn() -> SqlValue,
}
impl std::fmt::Debug for LiteralDefault {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LiteralDefault")
.field("column", &self.column)
.field("value", &(self.value)())
.finish()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DatabaseDefault {
pub column: &'static str,
pub default: &'static str,
}
impl GeneratedValue {
pub fn builtin(self) -> BuiltinDefault {
match self {
Self::Now => BuiltinDefault::Now,
Self::Uuid | Self::UuidText => BuiltinDefault::Uuid,
Self::Cuid => BuiltinDefault::Cuid,
}
}
}
impl<M, PK> ModelDescriptor<M, PK> {
pub const fn with_embedded_defaults(
self,
literal_defaults: &'static [LiteralDefault],
database_defaults: &'static [DatabaseDefault],
) -> Self {
Self {
literal_defaults,
database_defaults,
..self
}
}
pub fn fill_literal_defaults(&self, values: &mut Vec<SqlColumnValue>) {
for default in self.literal_defaults {
if values.iter().all(|value| value.column != default.column) {
values.push(SqlColumnValue {
column: default.column,
value: (default.value)(),
});
}
}
}
}