From 7142d926f56f91be9d6716c493d1cc96d88cb2a7 Mon Sep 17 00:00:00 2001
From: pavlospt
Date: Fri, 15 Mar 2024 14:47:38 +0200
Subject: [PATCH] Introduce features in rust-pgdatadiff-client
---
README.md | 24 ++++++-
rust-pgdatadiff-client/Cargo.toml | 11 ++-
rust-pgdatadiff-client/src/main.rs | 109 ++++++++++++++++++-----------
3 files changed, 97 insertions(+), 47 deletions(-)
diff --git a/README.md b/README.md
index 1be8974..9279785 100644
--- a/README.md
+++ b/README.md
@@ -27,8 +27,20 @@ _The benchmarks below are based on DBs with 5 tables and 1M rows each. The resul
In case you want to use this as a client you can install it through `cargo`:
+Client supports two features that allow you to choose between `Clap` or `Inquire` for running it.
+
+[![asciicast](https://asciinema.org/a/647065.svg)](https://asciinema.org/a/647065)
+
+## Clap
+
+```shell
+cargo install rust-pgdatadiff-client --features with-clap
+```
+
+## Inquire
+
```shell
-cargo install rust-pgdatadiff-client
+cargo install rust-pgdatadiff-client //or with `--features with-inquire`
```
# Installation (Library)
@@ -43,12 +55,13 @@ or
```toml
[dependencies]
-rust-pgdatadiff = "0.1.0"
+rust-pgdatadiff = "0.1"
```
# Usage (Client)
-```
+## Clap
+```shell
Usage: rust-pgdatadiff-client diff [OPTIONS]
Arguments:
@@ -68,6 +81,11 @@ Options:
-V, --version Print version
```
+## Inquire
+```shell
+rust-pgdatadiff-client
+```
+
# Usage (Library)
```rust
diff --git a/rust-pgdatadiff-client/Cargo.toml b/rust-pgdatadiff-client/Cargo.toml
index b182b6b..e3724af 100644
--- a/rust-pgdatadiff-client/Cargo.toml
+++ b/rust-pgdatadiff-client/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "rust-pgdatadiff-client"
-version = "0.1.2"
+version = "0.1.6"
edition = "2021"
license = "MIT"
description = "Rust client for comparing two PostgreSQL databases"
@@ -12,8 +12,13 @@ documentation = "https://docs.rs/rust-pgdatadiff-client"
[dependencies]
anyhow = "1.0.81"
-clap = { version = "4.5.2", features = ["derive"] }
+clap = { version = "4.5.2", features = ["derive"], optional = true }
tokio = "1.36.0"
env_logger = "0.11.3"
rust-pgdatadiff = { version = "0.1.2", path = ".." }
-inquire = "0.7.1"
+inquire = { version = "0.7.1", optional = true }
+
+[features]
+default = ["with-inquire"]
+with-inquire = ["dep:inquire"]
+with-clap = ["dep:clap"]
diff --git a/rust-pgdatadiff-client/src/main.rs b/rust-pgdatadiff-client/src/main.rs
index 3d120be..502ea8b 100644
--- a/rust-pgdatadiff-client/src/main.rs
+++ b/rust-pgdatadiff-client/src/main.rs
@@ -1,9 +1,14 @@
use anyhow::Result;
-use clap::{Parser, Subcommand};
+
+#[cfg(not(feature = "with-clap"))]
use inquire::{Confirm, Text};
+
+#[cfg(feature = "with-clap")]
+use clap::{Parser, Subcommand};
use rust_pgdatadiff::diff::diff_ops::Differ;
use rust_pgdatadiff::diff::diff_payload::DiffPayload;
+#[cfg(feature = "with-clap")]
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
#[command(propagate_version = true)]
@@ -12,6 +17,7 @@ struct Cli {
command: Commands,
}
+#[cfg(feature = "with-clap")]
#[derive(Subcommand)]
enum Commands {
#[command(about = "Print the version")]
@@ -48,45 +54,46 @@ enum Commands {
},
}
-#[tokio::main]
-async fn main() -> Result<()> {
- env_logger::init();
-
- // let cli = Cli::parse();
- // match &cli.command {
- // Commands::Version => {
- // println!("Version: {}", env!("CARGO_PKG_VERSION"));
- // Ok(())
- // }
- // Commands::Diff {
- // first_db,
- // second_db,
- // only_tables,
- // only_sequences,
- // only_count,
- // chunk_size,
- // max_connections,
- // include_tables,
- // exclude_tables,
- // schema_name,
- // } => {
- // let payload = DiffPayload::new(
- // first_db.clone(),
- // second_db.clone(),
- // *only_tables,
- // *only_sequences,
- // *only_count,
- // *chunk_size,
- // *max_connections,
- // include_tables.to_vec(),
- // exclude_tables.to_vec(),
- // schema_name.clone(),
- // );
- // let _ = Differ::diff_dbs(payload).await;
- // Ok(())
- // }
- // }
+#[cfg(feature = "with-clap")]
+async fn main_clap() -> Result<()> {
+ let cli = Cli::parse();
+ match &cli.command {
+ Commands::Version => {
+ println!("Version: {}", env!("CARGO_PKG_VERSION"));
+ Ok(())
+ }
+ Commands::Diff {
+ first_db,
+ second_db,
+ only_tables,
+ only_sequences,
+ only_count,
+ chunk_size,
+ max_connections,
+ include_tables,
+ exclude_tables,
+ schema_name,
+ } => {
+ let payload = DiffPayload::new(
+ first_db.clone(),
+ second_db.clone(),
+ *only_tables,
+ *only_sequences,
+ *only_count,
+ *chunk_size,
+ *max_connections,
+ include_tables.to_vec(),
+ exclude_tables.to_vec(),
+ schema_name.clone(),
+ );
+ let _ = Differ::diff_dbs(payload).await;
+ Ok(())
+ }
+ }
+}
+#[cfg(not(feature = "with-clap"))]
+async fn main_inquire() -> Result<()> {
let first_db = Text::new("First DB")
.with_default("postgres://postgres:postgres@localhost:5438/example")
.with_help_message("Enter the first database connection string")
@@ -136,10 +143,30 @@ async fn main() -> Result<()> {
only_count,
chunk_size.parse::().unwrap(),
max_connections.parse::().unwrap(),
- include_tables.trim().split_whitespace().into_iter().collect(),
- exclude_tables.trim().split_whitespace().into_iter().collect(),
+ include_tables
+ .split_whitespace()
+ .collect(),
+ exclude_tables
+ .split_whitespace()
+ .collect(),
schema_name,
);
let _ = Differ::diff_dbs(payload).await;
Ok(())
}
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ env_logger::init();
+
+ #[cfg(feature = "with-clap")]
+ {
+ _ = main_clap().await;
+ }
+ #[cfg(not(feature = "with-clap"))]
+ {
+ _ = main_inquire().await;
+ }
+
+ Ok(())
+}