|
|
@ -1,5 +1,13 @@ |
|
|
|
use clap::{Parser, Subcommand}; |
|
|
|
use clap::{Parser, Subcommand}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use std::fs; |
|
|
|
|
|
|
|
use std::io; |
|
|
|
|
|
|
|
use std::fmt; |
|
|
|
|
|
|
|
use std::path::Path; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const STORAGE_PATH: &str = "storage"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Parser)] |
|
|
|
#[derive(Parser)] |
|
|
|
#[command(name = "mps", version = "0.0.1", about = "MyPasswordStorage: Tool for storing your passwords locally with synchronization with git.")] |
|
|
|
#[command(name = "mps", version = "0.0.1", about = "MyPasswordStorage: Tool for storing your passwords locally with synchronization with git.")] |
|
|
|
struct Cli { |
|
|
|
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<RuntimeError> 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(); |
|
|
|
let cli = Cli::parse(); |
|
|
|
match &cli.command { |
|
|
|
match &cli.command { |
|
|
|
Some(Commands::Init) => { |
|
|
|
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."); |
|
|
|
println!("Initializing storage and config."); |
|
|
|
} |
|
|
|
} |
|
|
|
Some(Commands::Add{input}) => { |
|
|
|
Some(Commands::Add{..}) => { |
|
|
|
println!("about to add new item"); |
|
|
|
println!("about to add new item"); |
|
|
|
} |
|
|
|
} |
|
|
|
None => { |
|
|
|
None => { |
|
|
|
println!("Will be here init or list if storage inited"); |
|
|
|
println!("Will be here init or list if storage inited"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Ok(()) |
|
|
|
} |
|
|
|
} |
|
|
|