use std::path::PathBuf;
use std::{fs::File, path::Path};
use anyhow::{Context, Result};
use flate2::write::GzEncoder;
use flate2::Compression;
use temp_dir::TempDir;
use uuid::Uuid;
use crate::{aws::upload_file, config::Params};
pub(crate) struct Archive {
pub(crate) path: PathBuf,
_temp_dir: TempDir,
}
pub(crate) async fn backup(params: &Params) -> Result<()> {
let archive = compress_folder(¶ms.folder).context("compression failed")?;
upload_file(archive, params)
.await
.context("upload failed")?;
Ok(())
}
fn compress_folder(folder: impl AsRef<Path>) -> Result<Archive> {
let dir = TempDir::new()?;
let filename = format!("{}.tar.gz", Uuid::new_v4());
let file_path = dir.child(filename);
let tar_gz: File = File::create(&file_path)?;
let enc = GzEncoder::new(tar_gz, Compression::default());
let mut tar = tar::Builder::new(enc);
tar.append_dir_all(".", folder)?;
let res = tar.into_inner()?;
res.finish()?;
Ok(Archive {
path: file_path,
_temp_dir: dir,
})
}