learnwy_bin_utils 0.2.0

self use
use super::command::Command;
use crate::cli::Cli;
use crate::config::Config;
use clap::{Parser};
use thiserror::Error;
use crate::utils::collect::{join, pick};
use crate::utils::date::date_str;
use std::fs::OpenOptions;
use std::io::Write;
use crate::utils::paths::app_dir;

#[derive(Parser, Debug)]
pub struct GenPwd {
    #[clap(long)]
    gen_pwd: Option<String>,
}

impl Command for GenPwd {
    type Error = Error;

    fn apply(self, _config: &Config) -> Result<(), Self::Error> {
        println!("{}", gen_pwd());
        Ok(())
    }
}


#[derive(Error, Debug)]
pub enum Error {
    #[error("{}", "no error")]
    NoError,
}


static PWD_SEED: &str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

fn gen_pwd() -> String {
    let pwd = join(&(0..32).map(|_| pick(&PWD_SEED.chars().collect())).collect::<Vec<char>>());
    let home_dir = dirs::home_dir();
    if let Some(h) = app_dir() {
        let dir = h.join("pwd");
        std::fs::create_dir_all(dir.clone()).unwrap();
        OpenOptions::new()
            .create(true)
            .write(true)
            .append(true)
            .open(dir.join(date_str() + ".pwd"))
            .unwrap()
            .write_all(format!("{}\n", pwd).as_bytes()).unwrap();
    }
    pwd
}

mod tests {
    use crate::commands::gen_pwd::gen_pwd;

    #[test]
    fn test_1() {
        let mut result: Vec<String> = vec![];
        for i in 0u64..2u64.pow(4) {
            result.push(gen_pwd());
        }
        println!("{}", result.join("\n"));
    }
}