use anyhow::Result;
use clap::{Parser, Subcommand};
use dotenv::dotenv;
use env_logger::Env;
mod commands;
mod config;
mod core;
mod utils;
#[derive(Parser)]
#[command(name = "arcula")]
#[command(about = "Arcula - MongoDB database synchronization tool", long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Sync {
#[arg(short, long)]
from: Option<String>,
#[arg(short, long)]
to: Option<String>,
#[arg(short, long)]
db: Option<String>,
#[arg(short = 'n', long)]
target_db: Option<String>,
#[arg(short, long, default_value = "true")]
backup: Option<bool>,
#[arg(short = 'D', long, default_value = "true")]
drop: Option<bool>,
#[arg(short = 'c', long, default_value = "false")]
clear: Option<bool>,
#[arg(short, long)]
interactive: bool,
},
Info,
}
#[tokio::main]
async fn main() -> Result<()> {
dotenv().ok();
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
if let Err(err) = config::check_mongodb_tools() {
eprintln!("Error: MongoDB tools not found. Please install MongoDB tools (mongodump and mongorestore).");
eprintln!("Error details: {}", err);
return Err(anyhow::anyhow!("MongoDB tools not found"));
}
let cli = Cli::parse();
match cli.command {
Commands::Sync {
from,
to,
db,
target_db,
backup,
drop,
clear,
interactive,
} => {
let params = commands::sync::SyncParams {
from,
to,
db,
target_db,
backup,
drop,
clear,
interactive,
};
commands::sync::execute_with_params(params).await?;
}
Commands::Info => {
commands::info::execute().await?;
}
}
Ok(())
}