use crate::generators::tetherscript::model::{Field, Model};
use std::fmt::Write as _;
pub(super) fn columns(model: &Model) -> String {
let listed = model
.fields
.iter()
.map(|field| format!(" \"{}\"", field.column))
.collect::<Vec<_>>()
.join(",\n");
format!(
"// Every column, in the order the database reports them.\n\
fn columns() {{\n\
\x20 return Ok([\n{listed}\n\x20 ])\n\
}}\n\n"
)
}
pub(super) fn new(model: &Model) -> String {
let mut body = String::new();
for field in &model.fields {
let _ = writeln!(body, " row[\"{}\"] = {}", field.column, seed(field));
}
format!(
"// Builds a row with every column present.\n\
//\n\
// Database-assigned columns stay nil so validation can distinguish a value\n\
// that was never supplied from one deliberately left empty.\n\
fn new() {{\n\
\x20 let mut row = map()\n{body} return Ok(row)\n\
}}\n\n"
)
}
fn seed(field: &Field) -> &'static str {
if field.nullable || field.generated || is_timestamp(field) {
return "nil";
}
field.kind.zero()
}
pub(super) fn is_timestamp(field: &Field) -> bool {
matches!(field.column.as_str(), "created_at" | "updated_at")
}