rewrite generator entirely, again

This commit is contained in:
2025-04-04 22:04:06 +04:00
parent 8805072573
commit f380513725
21 changed files with 1323 additions and 221 deletions

View File

@@ -1,5 +1,6 @@
mod config;
mod generator;
mod templates;
use clap::Parser;
use color_eyre::{eyre::eyre, Report, Result};
@@ -8,6 +9,7 @@ use figment::{
providers::{Format, Serialized, Yaml},
Figment,
};
use handlebars::Handlebars;
use indicatif::{ProgressBar, ProgressStyle};
use sea_orm_codegen::{
DateTimeCrate as CodegenDateTimeCrate, EntityTransformer, EntityWriterContext, OutputFile,
@@ -37,52 +39,69 @@ async fn main() -> Result<()> {
tracing::info!(?args);
let mut handlebars = Handlebars::new();
templates::register_templates(&mut handlebars, &config).await?;
let output_dir = &config.output.path;
let output_internal_entities = output_dir.join("_entities");
let (_, table_stmts) = generator::discover::get_tables(args.database_url, &config).await?;
let writer_context = config.clone().into();
let output = EntityTransformer::transform(table_stmts.clone())?.generate(&writer_context);
let mut files = output
.files
.into_iter()
.map(|OutputFile { name, content }| (output_internal_entities.join(name), content))
.collect::<Vec<_>>();
generator::update_files(table_stmts, config.clone(), &handlebars).await?;
// let generate_files = generator::generate_models(table_stmts, config.clone())
// .await?
// .into_iter()
// .map(|OutputFile { name, content }| (output_dir.join(name), content))
// .collect::<Vec<_>>();
// files.extend(generate_files);
tracing::info!("Generated {} files", files.len());
fs::create_dir_all(&output_internal_entities).await?;
let progress_bar = ProgressBar::new((files.len() * 2) as u64)
.with_style(
ProgressStyle::default_bar()
.template("[{elapsed_precise}] {bar:40.cyan/blue} {pos}/{len} {msg}")?,
)
.with_message("Writing files");
let outputs = generator::generate(&args.database_url, &config, &handlebars).await?;
for (file_path, content) in files.iter() {
progress_bar.set_message(format!("Writing file: {:?}", file_path));
tracing::debug!(?file_path, "Writing file");
let mut file = fs::File::create(&file_path).await?;
file.write_all(content.as_bytes()).await?;
progress_bar.inc(1);
// tracing::info!(?outputs, "Generated files");
for output in outputs.iter() {
tracing::info!(?output, "Generated chunk");
// let mut file = fs::File::create(&output.path).await?;
// file.write_all(output.content.as_bytes()).await?;
}
progress_bar.set_message("Running rustfmt");
for (file_path, ..) in files.iter() {
tracing::debug!(?file_path, "Running rustfmt");
progress_bar.set_message(format!("Running rustfmt: {:?}", file_path));
let exit_status = Command::new("rustfmt").arg(file_path).status().await?; // Get the status code
let merged_outputs = generator::file::combine_chunks(outputs)?;
for output in merged_outputs.iter() {
tracing::info!(?output, "Merged file");
let mut file = fs::File::create(&output.path).await?;
file.write_all(output.content.as_bytes()).await?;
}
for output in merged_outputs.iter() {
tracing::info!(?output, "Running rustfmt");
let exit_status = Command::new("rustfmt").arg(&output.path).status().await?;
if !exit_status.success() {
// Propagate the error if any
return Err(eyre!("Failed to run rustfmt"));
}
progress_bar.inc(1);
}
progress_bar.finish();
//
// let output_dir = &config.output.path;
//
// let output_models_dir = output_dir.join(&config.output.models.path);
//
// let output_internal_entities = output_models_dir.join(&config.output.models.entities);
// let (_, table_stmts, db_type) =
// generator::discover::get_tables(args.database_url, &config).await?;
// let writer_context = config.clone().into();
// let output = EntityTransformer::transform(table_stmts.clone())?.generate(&writer_context);
// let mut files = output
// .files
// .into_iter()
// .map(|OutputFile { name, content }| (output_internal_entities.join(name), content))
// .collect::<Vec<_>>();
// // generator::update_files(table_stmts, config.clone(), &handlebars).await?;
// let generate_files = generator::update_files(table_stmts, config.clone(), &handlebars, db_type)
// .await?
// .into_iter()
// .map(|OutputFile { name, content }| (output_models_dir.join(name), content))
// .collect::<Vec<_>>();
// files.extend(generate_files);
// tracing::info!("Generated {} files", files.len());
// fs::create_dir_all(&output_internal_entities).await?;
//
// for (file_path, content) in files.iter() {
// tracing::info!(?file_path, "Writing file");
// let mut file = fs::File::create(&file_path).await?;
// file.write_all(content.as_bytes()).await?;
// }
//
// for (file_path, ..) in files.iter() {
// tracing::info!(?file_path, "Running rustfmt");
// let exit_status = Command::new("rustfmt").arg(file_path).status().await?; // Get the status code
// if !exit_status.success() {
// // Propagate the error if any
// return Err(eyre!("Failed to run rustfmt"));
// }
// }
Ok(())
}