#![allow(unused_assignments)]
mod cli;
mod codegen;
mod error;
mod load_schema;
mod parser;
mod prepare_queries;
mod read_queries;
mod type_registrar;
mod utils;
mod validation;
pub mod config;
pub mod conn;
pub mod container;
pub use cargo_toml;
use std::path::Path;
use tokio_postgres::Client;
use config::Config;
use parser::parse_query_module;
use prepare_queries::prepare;
use read_queries::read_query_modules;
#[doc(hidden)]
pub use cli::run;
pub use error::Error;
pub use load_schema::load_schema;
pub fn gen_live(client: &Client, config: Config) -> Result<(), Error> {
let modules = read_query_modules(config.queries.as_ref(), &config)?
.into_iter()
.map(parse_query_module)
.collect::<Result<_, parser::error::Error>>()
.map_err(Box::new)?;
let prepared_modules = prepare(client, modules, &config).map_err(Box::new)?;
let generated = codegen::gen(prepared_modules, &config);
generated.persist(config.destination, config.static_files)?;
Ok(())
}
pub fn gen_managed<P: AsRef<Path>>(schema_files: &[P], config: Config) -> Result<(), Error> {
let modules = read_query_modules(config.queries.as_ref(), &config)?
.into_iter()
.map(parse_query_module)
.collect::<Result<_, parser::error::Error>>()
.map_err(Box::new)?;
container::setup(
config.podman,
&config.container_image,
config.container_wait,
)?;
let client = conn::clorinde_conn()?;
load_schema(&client, schema_files).map_err(Box::new)?;
let prepared_modules = prepare(&client, modules, &config).map_err(Box::new)?;
let generated = codegen::gen(prepared_modules, &config);
container::cleanup(config.podman)?;
generated.persist(config.destination, config.static_files)?;
Ok(())
}
pub fn gen_fresh<P: AsRef<Path>>(
url: &str,
db_name: &str,
schema_files: &[P],
search_path: Option<&str>,
keep_db: bool,
config: Config,
) -> Result<(), Error> {
let modules = read_query_modules(config.queries.as_ref(), &config)?
.into_iter()
.map(parse_query_module)
.collect::<Result<_, parser::error::Error>>()
.map_err(Box::new)?;
let server_client = conn::from_url(url)?;
let create_db_query = format!("CREATE DATABASE \"{db_name}\"");
futures::executor::block_on(server_client.execute(&create_db_query, &[]))
.map_err(conn::error::Error)?;
let db_url = if url.contains('?') {
format!("{url}&dbname={db_name}")
} else if url.ends_with('/') {
format!("{url}{db_name}?")
} else {
format!("{url}/{db_name}?")
};
let generation_result = (|| -> Result<(), Error> {
let db_client = conn::from_url(&db_url)?;
if let Some(search_path) = search_path {
conn::set_search_path(&db_client, search_path)?;
}
load_schema(&db_client, schema_files).map_err(Box::new)?;
let prepared_modules = prepare(&db_client, modules, &config).map_err(Box::new)?;
let generated = codegen::gen(prepared_modules, &config);
generated.persist(config.destination, config.static_files)?;
Ok(())
})();
if !keep_db {
let drop_db_query = format!("DROP DATABASE \"{db_name}\"");
if let Err(e) = futures::executor::block_on(server_client.execute(&drop_db_query, &[])) {
eprintln!("Warning: Failed to drop temporary database '{db_name}': {e}");
}
}
generation_result
}