Skip to content

Commit

Permalink
Merge pull request #2 from pavlospt/feature/introduce-inquire-in-rust…
Browse files Browse the repository at this point in the history
…-pgdatadiff-client

Introduce Inquire & Clap features in rust-pgdatadiff-client
  • Loading branch information
pavlospt authored Mar 15, 2024
2 parents 8d5edaa + 80f8d62 commit d516706
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 9 deletions.
24 changes: 21 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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] <FIRST_DB> <SECOND_DB>

Arguments:
Expand All @@ -68,6 +81,11 @@ Options:
-V, --version Print version
```

## Inquire
```shell
rust-pgdatadiff-client
```

# Usage (Library)

```rust
Expand Down
10 changes: 8 additions & 2 deletions rust-pgdatadiff-client/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rust-pgdatadiff-client"
version = "0.1.2"
version = "0.1.7"
edition = "2021"
license = "MIT"
description = "Rust client for comparing two PostgreSQL databases"
Expand All @@ -12,7 +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 = { version = "0.7.1", optional = true }

[features]
default = ["with-inquire"]
with-inquire = ["dep:inquire"]
with-clap = ["dep:clap"]
88 changes: 84 additions & 4 deletions rust-pgdatadiff-client/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
use anyhow::Result;

#[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)]
Expand All @@ -11,6 +17,7 @@ struct Cli {
command: Commands,
}

#[cfg(feature = "with-clap")]
#[derive(Subcommand)]
enum Commands {
#[command(about = "Print the version")]
Expand Down Expand Up @@ -47,10 +54,8 @@ enum Commands {
},
}

#[tokio::main]
async fn main() -> Result<()> {
env_logger::init();

#[cfg(feature = "with-clap")]
async fn main_clap() -> Result<()> {
let cli = Cli::parse();
match &cli.command {
Commands::Version => {
Expand Down Expand Up @@ -86,3 +91,78 @@ async fn main() -> Result<()> {
}
}
}

#[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")
.prompt()?;
let second_db = Text::new("Second DB")
.with_default("postgres://postgres:postgres@localhost:5439/example")
.with_help_message("Enter the first database connection string")
.prompt()?;
let only_tables = Confirm::new("Do you want to only compare tables?")
.with_default(false)
.with_help_message("By confirming this option, you will only compare tables")
.prompt()?;
let only_sequences = Confirm::new("Do you want to only compare sequences?")
.with_default(false)
.with_help_message("By confirming this option, you will only compare sequences")
.prompt()?;
let only_count = Confirm::new("Do you want to only count rows of tables?")
.with_default(false)
.with_help_message("By confirming this option, you will only row counts of tables")
.prompt()?;
let chunk_size = Text::new("Number of rows to compare (in batch)")
.with_default("10000")
.with_help_message("Enter the chunk size when comparing data")
.prompt()?;
let max_connections = Text::new("Number of DB connections to utilize")
.with_default("100")
.with_help_message("Enter the max connections for Postgres pool")
.prompt()?;
let include_tables = Text::new("Tables to include in the comparison")
.with_default("")
.with_help_message("Enter the tables to include in the comparison (comma separated)")
.prompt()?;
let exclude_tables = Text::new("Tables to exclude from the comparison")
.with_default("")
.with_help_message("Enter the tables to exclude from the comparison (comma separated)")
.prompt()?;
let schema_name = Text::new("DB schema name to compare")
.with_default("public")
.with_help_message("Enter the DB schema name to perform the comparison on")
.prompt()?;

let payload = DiffPayload::new(
first_db,
second_db,
only_tables,
only_sequences,
only_count,
chunk_size.parse::<i64>().unwrap(),
max_connections.parse::<i64>().unwrap(),
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(())
}

0 comments on commit d516706

Please sign in to comment.