diff --git a/src/main.rs b/src/main.rs index 36a7278..cd6db4b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,13 @@ use clap::{Parser, Subcommand}; +use std::fs; +use std::io; +use std::fmt; +use std::path::Path; + +const STORAGE_PATH: &str = "storage"; + + #[derive(Parser)] #[command(name = "mps", version = "0.0.1", about = "MyPasswordStorage: Tool for storing your passwords locally with synchronization with git.")] struct Cli { @@ -21,17 +29,59 @@ enum Commands { } -fn main() { +enum RuntimeError { + Reinit, + BadInit +} + +impl fmt::Display for RuntimeError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + RuntimeError::Reinit => write!(f, "Initialization can't be second time. Remove store folder if you want new inizilization"), + RuntimeError::BadInit => write!(f, "Can`t create storage folder") + } + } +} + +impl From for std::io::Error { + fn from(err: RuntimeError) -> std::io::Error { + match err { + RuntimeError::Reinit => std::io::Error::new(std::io::ErrorKind::AlreadyExists, "Reinitialization attempted"), + RuntimeError::BadInit => std::io::Error::new(std::io::ErrorKind::Other, "Bad initialization"), + } + } +} + +fn init() -> Result<(), RuntimeError> { + let path = Path::new(STORAGE_PATH); + if path.exists() { + return Err(RuntimeError::Reinit); + } + + match fs::create_dir(STORAGE_PATH) { + Ok(_) => return Ok(()), + Err(_) => return Err(RuntimeError::BadInit), + } + + Ok(()) +} + +fn main() -> io::Result<()> { let cli = Cli::parse(); match &cli.command { Some(Commands::Init) => { + init().map_err(|e| match e { + RuntimeError::Reinit => std::io::Error::new(std::io::ErrorKind::AlreadyExists, "Reinitialization attempted"), + RuntimeError::BadInit => std::io::Error::new(std::io::ErrorKind::Other, "Bad initialization"), + })?; println!("Initializing storage and config."); } - Some(Commands::Add{input}) => { + Some(Commands::Add{..}) => { println!("about to add new item"); } None => { println!("Will be here init or list if storage inited"); } } + Ok(()) }