Add multi-database data layer

Introduce aether-data-schema and driver-specific schema generation for Postgres, MySQL, and SQLite.

Split data backends, lifecycle, repositories, and gateway runtime integration across database drivers.

Verified with cargo fmt --all --check, cargo clippy --workspace --all-targets -- -D warnings, and cargo test --workspace.
This commit is contained in:
fawney19
2026-05-05 18:27:36 +08:00
parent 099653f732
commit fce7e959e5
372 changed files with 86217 additions and 21160 deletions

View File

@@ -0,0 +1,76 @@
use std::path::PathBuf;
use aether_data_schema::dialect::{mysql, postgres, sqlite};
use aether_data_schema::{check_generated_dir, generate_loaded_to_dir, load_schema_sources};
use clap::{Parser, Subcommand, ValueEnum};
#[derive(Debug, Parser)]
#[command(name = "aether-schema")]
#[command(about = "Generate SQL from Aether logical schema definitions")]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Debug, Subcommand)]
enum Command {
Generate {
#[arg(long, default_value = "crates/aether-data/schema/logical")]
schema_dir: PathBuf,
#[arg(long, default_value = "crates/aether-data/schema/generated")]
output_dir: PathBuf,
},
Check {
#[arg(long, default_value = "crates/aether-data/schema/logical")]
schema_dir: PathBuf,
#[arg(long, default_value = "crates/aether-data/schema/generated")]
output_dir: PathBuf,
#[arg(long = "require-tables-from")]
require_tables_from: Vec<PathBuf>,
},
Print {
#[arg(long, default_value = "crates/aether-data/schema/logical")]
schema_dir: PathBuf,
#[arg(long)]
driver: Driver,
},
}
#[derive(Debug, Clone, Copy, ValueEnum)]
enum Driver {
Postgres,
Mysql,
Sqlite,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let cli = Cli::parse();
match cli.command {
Command::Generate {
schema_dir,
output_dir,
} => {
let loaded = load_schema_sources(schema_dir)?;
generate_loaded_to_dir(&loaded, output_dir)?;
}
Command::Check {
schema_dir,
output_dir,
require_tables_from,
} => {
let loaded = load_schema_sources(schema_dir)?;
check_generated_dir(&loaded, output_dir)?;
aether_data_schema::check_required_tables(&loaded.schema, &require_tables_from)?;
}
Command::Print { schema_dir, driver } => {
let schema = load_schema_sources(schema_dir)?.schema;
let output = match driver {
Driver::Postgres => postgres::emit_schema(&schema),
Driver::Mysql => mysql::emit_schema(&schema),
Driver::Sqlite => sqlite::emit_schema(&schema),
};
print!("{output}");
}
}
Ok(())
}