From dfaf6931b9e0dde8d153c5a72d65e4bd5445f603 Mon Sep 17 00:00:00 2001 From: Nikkuss Date: Mon, 24 Mar 2025 21:47:00 +0400 Subject: [PATCH] work --- Cargo.toml | 6 ++++- src/generate.rs | 29 ++++++++++++++++++++++ src/main.rs | 66 +++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 src/generate.rs diff --git a/Cargo.toml b/Cargo.toml index ab488df..106dcdc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,9 +4,13 @@ version = "0.1.0" edition = "2021" [dependencies] -clap = { version = "4.5.32", features = ["derive"] } +clap = { version = "4.5.32", features = ["derive", "env"] } color-eyre = "0.6.3" +figment = { version = "0.10.19", features = ["toml"] } sea-schema = "0.16.1" +serde = { version = "1.0.219", features = ["derive"] } syn = { version = "2.0.100", features = ["extra-traits", "full"] } +tokio = { version = "1.44.1", features = ["full"] } tracing = "0.1.41" tracing-subscriber = "0.3.19" +url = "2.5.4" diff --git a/src/generate.rs b/src/generate.rs new file mode 100644 index 0000000..3c6c621 --- /dev/null +++ b/src/generate.rs @@ -0,0 +1,29 @@ +use color_eyre::{ + eyre::{eyre, ContextCompat}, + Result, +}; +use url::Url; +pub async fn generate(database_url: String) -> Result<()> { + let url = Url::parse(&database_url)?; + + tracing::trace!(?url); + + let is_sqlite = url.scheme() == "sqlite"; + + let database_name = (if !is_sqlite { + let database_name = url + .path_segments() + .context("No database name as part of path")? + .next() + .context("No database name as part of path")?; + + if database_name.is_empty() { + return Err(eyre!("Database path name is empty")); + } + Ok(database_name) + } else { + Ok(Default::default()) + })?; + + Ok(()) +} diff --git a/src/main.rs b/src/main.rs index 928f881..1afd334 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,22 +1,72 @@ +mod generate; use std::{fs, path::PathBuf}; use clap::Parser; use color_eyre::Result; +use figment::{ + providers::{Format, Serialized, Toml}, + Figment, +}; +use serde::{Deserialize, Serialize}; -const DEFAULTS: [&str; 2] = ["prelude.rs", "mod.rs"]; +#[derive(Deserialize, Serialize, Debug)] +struct Config { + sea_orm: SeaOrmConfig, +} + +#[derive(Deserialize, Serialize, Debug)] +struct SeaOrmConfig { + expanded_format: bool, + table: SeaOrmTableConfig, + include_hidden_tables: bool, + with_serde: bool, + serde_skip_deserializing_primary_key: bool, + serde_skip_hidden_column: bool, +} +#[derive(Deserialize, Serialize, Debug)] +struct SeaOrmTableConfig { + include_hidden: bool, + only: Vec, + exclude: Vec, +} + +impl Default for Config { + fn default() -> Self { + Self { + sea_orm: SeaOrmConfig { + table: SeaOrmTableConfig { + include_hidden: false, + only: Vec::new(), + exclude: Vec::new(), + }, + expanded_format: false, + include_hidden_tables: false, + with_serde: false, + serde_skip_hidden_column: false, + serde_skip_deserializing_primary_key: false, + }, + } + } +} #[derive(Parser, Debug)] struct Args { - data_dir: PathBuf, - #[clap(short, long, default_value = "_entities")] - entities_folder: String, + #[clap(short, long, default_value = "generator.toml")] + config: String, + #[clap(short, long, env = "DATABASE_URL")] + database_url: String, } - -fn main() -> Result<()> { +#[tokio::main] +async fn main() -> Result<()> { color_eyre::install()?; tracing_subscriber::fmt::init(); let args = Args::parse(); - tracing::info!(?args.data_dir, ?args.entities_folder, "Generating/Updating models from entities"); - + let config: Config = Figment::new() + .merge(Serialized::defaults(Config::default())) + .merge(Toml::file(&args.config)) + .extract()?; + tracing::info!(?config); + tracing::info!(?args); + generate::generate(args.database_url).await; Ok(()) }