pub mod pydantic;
pub mod rust;
pub mod sql;
pub mod zod;
use crate::schema::ContractSchema;
pub fn header(schema: &ContractSchema, epoch: u32, comment: &str) -> String {
format!(
"{comment} GENERATED by pushkin compile from contract '{name}' — do not hand-edit.\n\
{comment} pushkin-epoch: {epoch}\n",
name = schema.contract_name,
)
}
pub fn type_name(schema: &ContractSchema) -> String {
let mut pascal = String::new();
for part in schema.contract_name.split(['-', '_']) {
let mut chars = part.chars();
if let Some(first) = chars.next() {
pascal.extend(first.to_uppercase());
pascal.push_str(chars.as_str());
}
}
format!("{pascal}Create")
}
pub fn number_literal(value: f64) -> String {
format!("{value}")
}
pub fn python_number_literal(value: f64) -> String {
let shared = number_literal(value);
if shared.contains(['.', 'e', 'E']) {
return shared;
}
format!("{shared}.0")
}
pub fn quoted_string(value: &str) -> String {
let mut output = String::with_capacity(value.len() + 2);
output.push('"');
for character in value.chars() {
match character {
'"' => output.push_str("\\\""),
'\\' => output.push_str("\\\\"),
'\n' => output.push_str("\\n"),
'\r' => output.push_str("\\r"),
'\t' => output.push_str("\\t"),
'\u{0008}' => output.push_str("\\b"),
'\u{000C}' => output.push_str("\\f"),
'\u{2028}' => output.push_str("\\u2028"),
'\u{2029}' => output.push_str("\\u2029"),
control if control.is_control() => {
use std::fmt::Write as _;
let _ = write!(output, "\\u{:04x}", u32::from(control));
}
other => output.push(other),
}
}
output.push('"');
output
}