hardcpy 0.1.0

Simple backup tool written in Rust
#[cfg(test)]
mod tests {
    use crate::_copy;
    use colored::Colorize;
    use ini::Ini;
    use rand::Rng;
    use std::fs;
    use std::fs::File;
    use std::io::Write;

    const FILE_SIZE: usize = 1024 * 1024 * 16;
    const FILE_SIZE_S: usize = 1024 * 1024;
    #[test]
    fn create_backup_singlethread() {
        let mut config_dir = dirs::config_dir().unwrap_or_else(|| {
            println!(
                "{} Couldn't get a config directory, using current directory.",
                "[INFO]".bright_yellow()
            );
            std::env::current_dir().unwrap()
        });
        config_dir.push("hardcpy");
        fs::create_dir_all(&config_dir).unwrap();

        let mut config = Ini::load_from_file(config_dir.join("config.ini")).unwrap_or(Ini::new());

        fs::create_dir_all("test/test_singlethread/source").unwrap();
        fs::create_dir_all("test/test_singlethread/dest").unwrap();

        let mut f = File::create("test/test_singlethread/source/big_file").unwrap();
        let mut rng = rand::thread_rng();
        let mut buf = Vec::with_capacity(FILE_SIZE);
        for _ in 0..=FILE_SIZE {
            buf.push(rng.gen());
        }
        f.write_all(&*buf).unwrap();
        f.flush().unwrap();

        _copy(
            config_dir.clone(),
            &mut config,
            false,
            "test/test_singlethread/source".into(),
            "test/test_singlethread/dest".into(),
        );
    }

    #[test]
    fn create_backup_multithread() {
        let mut config_dir = dirs::config_dir().unwrap_or_else(|| {
            println!(
                "{} Couldn't get a config directory, using current directory.",
                "[INFO]".bright_yellow()
            );
            std::env::current_dir().unwrap()
        });
        config_dir.push("hardcpy");
        fs::create_dir_all(&config_dir).unwrap();

        let mut config = Ini::load_from_file(config_dir.join("config.ini")).unwrap_or(Ini::new());

        fs::create_dir_all("test/test_multithread/source").unwrap();
        fs::create_dir_all("test/test_multithread/dest").unwrap();

        for i in 1..=16 {
            let mut f =
                File::create(format!("test/test_multithread/source/small_file{}", i)).unwrap();
            let mut rng = rand::thread_rng();
            let mut buf = Vec::with_capacity(FILE_SIZE_S);
            for _ in 0..=FILE_SIZE_S {
                buf.push(rng.gen());
            }
            f.write_all(&*buf).unwrap();
            f.flush().unwrap();
        }

        _copy(
            config_dir.clone(),
            &mut config,
            true,
            "test/test_multithread/source".into(),
            "test/test_multithread/dest".into(),
        );
    }
}