use clap::Parser;
use syncbox::{cli, infra, sync};
use tracing::{info};
use syncbox::sync::{sync_directories, SyncParameters};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let args = cli::Args::parse();
infra::logging::init_logger();
match args.command {
cli::Command::Sync {
source,
target,
dry_run,
checksum,
delete,
exclude,
delete_exclude,
detail
} => {
let params = SyncParameters {
source: source.clone(),
target: target.clone(),
dry_run,
checksum,
excludes: exclude.clone(),
delete_extra: delete,
delete_excludes: delete_exclude.clone(),
detail
};
info!(
"Sync: copying file {} → {}",
source.display(),
target.display()
);
sync_directories(¶ms).await?;
}
cli::Command::Run {
name,
config,
dry_run,
checksum, detail
} => {
let config = syncbox::config::Config::from_file(&config)
.map_err(|e| anyhow::anyhow!("Config error: {}", e))?;
let task = config
.find_task(&name)
.ok_or_else(|| anyhow::anyhow!("Task '{}' not found in config", name))?;
info!(
"Run: copying file {} → {}",
&task.source.display(),
&task.target.display()
);
let mut params = sync::SyncParameters::from(task);
params.dry_run = dry_run;
params.checksum = checksum;
params.detail = detail;
sync::sync_directories(¶ms).await?;
}
cli::Command::Watch {
name,
config,
dry_run,
delay,
checksum,
detail
} => {
let config = syncbox::config::Config::from_file(&config)
.map_err(|e| anyhow::anyhow!("Config error: {}", e))?;
let task = config
.find_task(&name)
.ok_or_else(|| anyhow::anyhow!("Task '{}' not found in config", name))?;
info!(
"Watch: copying file {} → {}",
&task.source.display(),
&task.target.display()
);
let mut params = sync::SyncParameters::from(task);
params.checksum = checksum; params.detail = detail;
params.dry_run = dry_run;
sync::watch_task(¶ms, delay).await?;
}
}
Ok(())
}