use super::Table;
use proc_macro_error::abort_call_site;
use quote::quote_spanned;
pub(super) fn update(table: &Table) -> proc_macro2::TokenStream {
if table.columns[0].name != "id" {
abort_call_site!("First field must be `id: Option<u64>`");
}
let sql = makesql_update(table);
quote_spanned! { table.span =>
fn update_sql(&self) -> Result<String, ::sqlrender::Error> {
assert!(self.id.is_some());
let statement = #sql;
Ok(statement.to_string())
}
}
}
fn makesql_update(table: &Table) -> String {
format!(
"UPDATE `{}` SET {} WHERE id=?",
table.name,
table
.columns
.iter()
.filter(|c| c.name != "id" && c.name != "deleted_at")
.map(|c| format!("`{}`=?", c.name.as_str()))
.collect::<Vec<_>>()
.join(", ")
)
}