feat: allow to write schema to any type who impl Write

This commit is contained in:
Alexander Navarro 2025-01-24 19:15:21 -03:00
parent de506a73df
commit b93f037017
3 changed files with 21 additions and 5 deletions

View file

@ -30,6 +30,9 @@ enum Commands {
Discover {
/// Schema to discover, it defaults to `public` in postures.
schema: Option<String>,
#[arg(short = 'o', long)]
output: Option<String>,
},
}
@ -48,7 +51,9 @@ async fn main() -> Result<()> {
// matches just as you would the top level cmd
let result = match &cli.command {
Commands::Query { sql } => sql::handle_query(url, sql).await,
Commands::Discover { schema } => sql::discover_scheme(url, schema.to_owned()).await,
Commands::Discover { schema, output } => {
sql::discover_scheme(url, schema.to_owned(), output.to_owned()).await
}
};
if let Err(err) = result {

View file

@ -1,4 +1,6 @@
use std::fs::File;
use std::io;
use std::path::Path;
use clap::ValueEnum;
use sea_schema::postgres::discovery::SchemaDiscovery;
@ -45,7 +47,11 @@ pub async fn handle_query(url: String, query: &String) -> Result<()> {
return Ok(());
}
pub async fn discover_scheme(url: String, schema: Option<String>) -> Result<()> {
pub async fn discover_scheme(
url: String,
schema: Option<String>,
output: Option<String>,
) -> Result<()> {
let (_, db_name) = get_connector(&url).await?;
let schema_discovery = match db_name.as_str() {
@ -69,7 +75,12 @@ pub async fn discover_scheme(url: String, schema: Option<String>) -> Result<()>
.schemas
.insert(schema.schema.to_owned(), Schema::from(schema));
data_model.write(&mut io::stdout())?;
let mut buffer: Box<dyn io::Write> = match output {
Some(path) => Box::new(File::create(Path::new(&path))?),
None => Box::new(io::stdout()),
};
data_model.write(&mut buffer)?;
Ok(())
}

View file

@ -48,8 +48,8 @@ impl DataModel {
}
impl DataModel {
pub fn write<T: Write>(&self, writter: &mut T) -> error::Result<()> {
writter.write_all(self.to_string().as_bytes())?;
pub fn write<T: Write>(&self, buffer: &mut T) -> error::Result<()> {
buffer.write_all(self.to_string().as_bytes())?;
Ok(())
}
}