sqlrender-impl 0.1.0

Internal implementation details for SqlRender.
Documentation
use super::Table;
use proc_macro_error::abort_call_site;
use quote::quote_spanned;

pub(super) fn ddl(table: &Table) -> proc_macro2::TokenStream {
	if table.columns[0].name != "id" {
		abort_call_site!("First field must be `id: Option<u64>`");
	}

	let sql = makesql_ddl(table);

	quote_spanned! { table.span =>
		fn ddl_sql(&self) -> Result<String, ::sqlrender::Error> {
			assert!(self.id.is_some());
			let statement = #sql;
			Ok(statement.to_string())
		}
	}
}

fn makesql_ddl(table: &Table) -> String {
	format!(
		r#"CREATE TABLE `{0}` (
{1},
	KEY `idx_{0}_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"#,
		table.name,
		table
			.columns
			.iter()
			.map(|c| format!("\t`{}` {}", c.name, c.sql_type))
			.collect::<Vec<_>>()
			.join(",\n")
	)
}