#![warn(missing_docs)]
#![warn(clippy::unwrap_used)]
#![warn(clippy::expect_used)]
use std::{env, sync::Arc, time::Duration};
use anyhow::{anyhow, Context, Result};
use dotenvy::dotenv;
use log::*;
use tokio::{task, time};
use backup::backup;
use config::parse_config;
use crate::prelude::*;
mod aws;
mod backup;
mod config;
mod prelude;
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<()> {
dotenv().ok();
if env::var("RUST_LOG").is_err() {
env::set_var(
"RUST_LOG",
"awsbck=info,aws_config=warn,aws_credential_types=warn,tracing=warn",
);
};
env_logger::init();
let params = Arc::new(parse_config().await?);
match params.interval {
Some(interval) => {
info!(
"Will backup \"{}\" every {interval} seconds",
params.folder.to_string_lossy()
);
let task = task::spawn(async move {
let shared_params = Arc::clone(¶ms);
let mut interval = time::interval(Duration::from_secs(interval));
loop {
interval.tick().await; match backup(&shared_params).await {
Ok(_) => {
info!("Backup succeeded");
}
Err(e) => {
error!("Backup error: {e:#}");
}
}
}
});
let ctrl_c = tokio::spawn(async move {
tokio::signal::ctrl_c().await.or_panic();
});
tokio::select! {
_ = ctrl_c => {
info!("Ctrl-C received, exiting");
}
_ = task => {
info!("Backup task exited, exiting");
}
}
}
None => {
info!("Backuping \"{}\" once", params.folder.to_string_lossy());
backup(¶ms)
.await
.with_context(|| anyhow!("Backup error"))?;
info!("Backup succeeded");
}
}
Ok(())
}