use super::super::naming::{snake, sql};
use super::inputs::optional;
use crate::database::introspection::Column;
pub(super) fn insert(columns: &[&Column]) -> (String, String) {
let (names, values): (Vec<_>, Vec<_>) = columns
.iter()
.map(|column| (column_push(column), value_push(column)))
.unzip();
(names.join("\n"), values.join("\n"))
}
fn column_push(column: &Column) -> String {
let field = snake(&column.name);
let push = format!("columns.push({:?});", sql(&column.name));
if optional(column) {
format!(" if input.{field}.is_some() {{\n {push}\n }}")
} else {
format!(" {push}")
}
}
fn value_push(column: &Column) -> String {
let field = snake(&column.name);
if optional(column) {
format!(
" if let Some(value) = input.{field}.as_ref() {{\n values.push_bind(value);\n }}"
)
} else {
format!(" values.push_bind(&input.{field});")
}
}
pub(super) fn assignment(column: &Column) -> String {
assignment_from(column, "input")
}
pub(super) fn assignment_from(column: &Column, input: &str) -> String {
let field = snake(&column.name);
let assignment = format!("{} = ", sql(&column.name));
format!(
" if let Some(value) = {input}.{field}.as_ref() {{\n\
set.push({assignment:?}).push_bind_unseparated(value);\n\
}}"
)
}