This commit is contained in:
2025-04-01 21:33:03 +04:00
parent f012a96173
commit dc9695dac0
4 changed files with 335 additions and 126 deletions

View File

@@ -1,10 +1,12 @@
mod config;
mod generate;
use std::{fs, path::PathBuf, str::FromStr};
use clap::Parser;
use color_eyre::{Report, Result};
use config::Config;
use figment::{
providers::{Format, Serialized, Toml},
providers::{Format, Serialized, Yaml},
Figment,
};
use sea_orm_codegen::{
@@ -13,97 +15,82 @@ use sea_orm_codegen::{
};
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Debug, Clone)]
struct Config {
sea_orm: SeaOrmConfig,
}
// #[derive(Deserialize, Serialize, Debug, Clone)]
// struct Config {
// sea_orm: SeaOrmConfig,
// }
#[derive(Deserialize, Serialize, Debug, Clone)]
enum DateTimeCrate {
Time,
Chrono,
}
impl From<DateTimeCrate> for CodegenDateTimeCrate {
fn from(date_time_crate: DateTimeCrate) -> CodegenDateTimeCrate {
match date_time_crate {
DateTimeCrate::Chrono => CodegenDateTimeCrate::Chrono,
DateTimeCrate::Time => CodegenDateTimeCrate::Time,
}
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
struct SeaOrmConfig {
expanded_format: bool,
table: SeaOrmTableConfig,
with_serde: String,
with_prelude: String,
with_copy_enums: bool,
serde_skip_deserializing_primary_key: bool,
serde_skip_hidden_column: bool,
max_connections: u32,
acquire_timeout: u64,
database_schema: Option<String>,
date_format: DateTimeCrate,
}
#[derive(Deserialize, Serialize, Debug, Clone)]
struct SeaOrmTableConfig {
include_hidden: bool,
only: Vec<String>,
exclude: Vec<String>,
}
impl Default for Config {
fn default() -> Self {
Self {
sea_orm: SeaOrmConfig {
table: SeaOrmTableConfig {
include_hidden: false,
only: Vec::new(),
exclude: Vec::new(),
},
database_schema: None,
max_connections: 10,
acquire_timeout: 30,
expanded_format: false,
with_copy_enums: false,
with_serde: String::from("none"),
with_prelude: String::from("none"),
serde_skip_hidden_column: false,
serde_skip_deserializing_primary_key: false,
date_format: DateTimeCrate::Time,
},
}
}
}
impl TryInto<EntityWriterContext> for Config {
type Error = Report;
fn try_into(self) -> Result<EntityWriterContext> {
Ok(EntityWriterContext::new(
self.sea_orm.expanded_format,
WithPrelude::from_str(&self.sea_orm.with_prelude)?,
WithSerde::from_str(&self.sea_orm.with_serde)?,
self.sea_orm.with_copy_enums,
self.sea_orm.date_format.into(),
self.sea_orm.database_schema,
false,
self.sea_orm.serde_skip_deserializing_primary_key,
self.sea_orm.serde_skip_hidden_column,
Vec::new(),
Vec::new(),
Vec::new(),
Vec::new(),
false,
false,
))
}
}
// #[derive(Deserialize, Serialize, Debug, Clone)]
// struct SeaOrmConfig {
// expanded_format: bool,
// table: SeaOrmTableConfig,
// with_serde: String,
// with_prelude: String,
// with_copy_enums: bool,
// serde_skip_deserializing_primary_key: bool,
// serde_skip_hidden_column: bool,
// max_connections: u32,
// acquire_timeout: u64,
// database_schema: Option<String>,
// date_format: DateTimeCrate,
// }
// #[derive(Deserialize, Serialize, Debug, Clone)]
// struct SeaOrmTableConfig {
// include_hidden: bool,
// only: Vec<String>,
// exclude: Vec<String>,
// }
//
// impl Default for Config {
// fn default() -> Self {
// Self {
// sea_orm: SeaOrmConfig {
// table: SeaOrmTableConfig {
// include_hidden: false,
// only: Vec::new(),
// exclude: Vec::new(),
// },
// database_schema: None,
// max_connections: 10,
// acquire_timeout: 30,
// expanded_format: false,
// with_copy_enums: false,
// with_serde: String::from("none"),
// with_prelude: String::from("none"),
// serde_skip_hidden_column: false,
// serde_skip_deserializing_primary_key: false,
// date_format: DateTimeCrate::Time,
// },
// }
// }
// }
// impl TryInto<EntityWriterContext> for Config {
// type Error = Report;
// fn try_into(self) -> Result<EntityWriterContext> {
// Ok(EntityWriterContext::new(
// self.sea_orm.expanded_format,
// WithPrelude::from_str(&self.sea_orm.with_prelude)?,
// WithSerde::from_str(&self.sea_orm.with_serde)?,
// self.sea_orm.with_copy_enums,
// self.sea_orm.date_format.into(),
// self.sea_orm.database_schema,
// false,
// self.sea_orm.serde_skip_deserializing_primary_key,
// self.sea_orm.serde_skip_hidden_column,
// Vec::new(),
// Vec::new(),
// Vec::new(),
// Vec::new(),
// false,
// false,
// ))
// }
// }
//
#[derive(Parser, Debug)]
struct Args {
#[clap(short, long, default_value = "generator.toml")]
#[clap(short, long, default_value = "generator.yml")]
config: String,
#[clap(short, long, env = "DATABASE_URL")]
database_url: String,
@@ -115,13 +102,13 @@ async fn main() -> Result<()> {
let args = Args::parse();
let config: Config = Figment::new()
.merge(Serialized::defaults(Config::default()))
.merge(Toml::file(&args.config))
// .merge(Serialized::defaults(Config::default()))
.merge(Yaml::file(&args.config))
.extract()?;
tracing::info!(?config);
tracing::info!(?args);
let (_, table_stmts) = generate::get_tables(args.database_url, &config).await?;
let writer_context = config.clone().try_into()?;
let output = EntityTransformer::transform(table_stmts)?.generate(&writer_context);
// let (_, table_stmts) = generate::get_tables(args.database_url, &config).await?;
// let writer_context = config.clone().try_into()?;
// let output = EntityTransformer::transform(table_stmts)?.generate(&writer_context);
Ok(())
}