Compare commits

..

No commits in common. 'main' and 'item-number-refactoring' have entirely different histories.

  1. 133
      src/main.rs
  2. 7
      src/storage.rs

133
src/main.rs

@ -46,10 +46,7 @@ enum Commands {
Edit(ItemIdArgs), Edit(ItemIdArgs),
/// Delete item /// Delete item
Delete(ItemIdArgs), Delete(ItemIdArgs)
/// Set new passphrase
Password
} }
@ -124,7 +121,10 @@ impl MPS {
Ok(ps) Ok(ps)
} }
fn read_new_password() -> io::Result<String> { fn init() -> io::Result<()> {
if Storage::is_inited()? {
return Err(io::Error::new(io::ErrorKind::AlreadyExists, "Reinitialization attempted"));
}
let passphrase; let passphrase;
loop { loop {
match MPS::prompt_new_password() { match MPS::prompt_new_password() {
@ -138,15 +138,8 @@ impl MPS {
} }
} }
} }
Ok(passphrase) Storage::init(passphrase)?;
} Ok(())
fn init() -> io::Result<()> {
if Storage::is_inited()? {
return Err(io::Error::new(io::ErrorKind::AlreadyExists, "Reinitialization attempted"));
}
let passphrase = MPS::read_new_password()?;
Storage::init(passphrase)
} }
pub fn login(&mut self) -> io::Result<()> { pub fn login(&mut self) -> io::Result<()> {
@ -163,14 +156,6 @@ impl MPS {
Ok(()) Ok(())
} }
pub fn password(&mut self) -> io::Result<()> {
self.login()?;
let st = self.storage.as_ref().unwrap();
let passphrase = MPS::read_new_password()?;
let new_st = st.new_from_passphrase(&passphrase);
new_st.dump()
}
fn list(&mut self) -> io:: Result<()> { fn list(&mut self) -> io:: Result<()> {
self.login()?; self.login()?;
let ids = self.storage.as_ref().unwrap().ids(); let ids = self.storage.as_ref().unwrap().ids();
@ -186,12 +171,25 @@ impl MPS {
Ok(()) Ok(())
} }
/// Show item. Id must exists
fn show(&mut self, id: &String) -> io::Result<()> { fn show(&mut self, id: &String) -> io::Result<()> {
self.login()?; self.login()?;
let st = self.storage.as_ref().unwrap(); let st = self.storage.as_ref().unwrap();
if !st.contains(id) {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
format!("Can`t find id: {}", id)
));
}
let item = st.get(id); let item = st.get(id);
editor::open_to_show(&item.content) editor::open_to_show(&item.content)?;
Ok(())
}
fn show_by_number(&mut self, number: u32) -> io::Result<()> {
self.login()?;
let st = self.storage.as_ref().unwrap();
let id = st.get_id_by_number(number)?;
self.show(&id)
} }
fn add(&mut self, id: &String) -> io::Result<()> { fn add(&mut self, id: &String) -> io::Result<()> {
@ -210,10 +208,10 @@ impl MPS {
// set empty string because there is no content yet // set empty string because there is no content yet
let content = editor::open_to_edit(&String::from(""))?; let content = editor::open_to_edit(&String::from(""))?;
st.add(Item::from(id.clone(), content)); st.add(Item::from(id.clone(), content));
st.dump() st.dump()?;
Ok(())
} }
/// Edit item, id need not to exist
fn edit(&mut self, id: &String) -> io::Result<()> { fn edit(&mut self, id: &String) -> io::Result<()> {
self.login()?; self.login()?;
let st = self.storage.as_mut().unwrap(); let st = self.storage.as_mut().unwrap();
@ -231,48 +229,39 @@ impl MPS {
let new_content = editor::open_to_edit(&item.content)?; let new_content = editor::open_to_edit(&item.content)?;
item.content = new_content; item.content = new_content;
st.update(item); st.update(item);
st.dump() st.dump()?;
Ok(())
} }
// Delete item by id, is must exist fn edit_by_number(&mut self, number: u32) -> io::Result<()> {
fn delete(&mut self, id: &String) -> io::Result<()> {
self.login()?; self.login()?;
let st = self.storage.as_mut().unwrap(); let st = self.storage.as_mut().unwrap();
st.remove(id); let id = st.get_id_by_number(number)?;
st.dump() self.edit(&id)
} }
/// Resolve id by ItemArgs. fn delete(&mut self, id: &String) -> io::Result<()> {
/// # Arguments
/// * `args` - arguments to parse
/// * `check` - check that id existing
fn item_id_by_item_id_args(&mut self, args: &ItemIdArgs, check: bool) -> io::Result<String> {
self.login()?; self.login()?;
let st = self.storage.as_mut().unwrap(); let st = self.storage.as_mut().unwrap();
let mut item_id: String = "NOT_INITIALIZED".to_string(); if !st.contains(id) {
if let Some(id) = &args.id { return Err(io::Error::new(
item_id = id.clone();
if check && !st.contains(&id) {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
format!("No such item {}", id)
));
}
}
if let Some(number) = &args.number {
item_id = st.get_id_by_number(*number)?;
// we can guarantee that id exists because we take it by id
}
if args.id.is_none() && args.number.is_none() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput, io::ErrorKind::InvalidInput,
format!("Bag arguments") "No such item"
)); ));
} }
Ok(item_id.clone()) st.remove(id);
st.dump()?;
Ok(())
} }
}
fn delete_by_number(&mut self, number: u32) -> io::Result<()> {
self.login()?;
let st = self.storage.as_mut().unwrap();
let id = st.get_id_by_number(number)?;
self.delete(&id)
}
}
fn run_command() -> io::Result<()> { fn run_command() -> io::Result<()> {
let cli = Cli::parse(); let cli = Cli::parse();
@ -284,28 +273,36 @@ fn run_command() -> io::Result<()> {
let mut mps = MPS::new(); let mut mps = MPS::new();
mps.list()?; mps.list()?;
} }
Some(Commands::Show(args)) => { Some(Commands::Show(item)) => {
let mut mps = MPS::new(); let mut mps = MPS::new();
let id = mps.item_id_by_item_id_args(args, true)?; if let Some(id) = &item.id {
mps.show(&id)?; mps.show(id)?;
}
if let Some(number) = &item.number {
mps.show_by_number(*number)?;
}
} }
Some(Commands::Add { id }) => { Some(Commands::Add { id }) => {
let mut mps = MPS::new(); let mut mps = MPS::new();
mps.add(id)?; mps.add(id)?;
} }
Some(Commands::Edit(args)) => { Some(Commands::Edit(item)) => {
let mut mps = MPS::new(); let mut mps = MPS::new();
let id = mps.item_id_by_item_id_args(args, false)?; if let Some(id) = &item.id {
mps.edit(&id)?; mps.edit(id)?;
} }
Some(Commands::Delete(args)) => { if let Some(number) = &item.number {
let mut mps = MPS::new(); mps.edit_by_number(*number)?;
let id = mps.item_id_by_item_id_args(args, true)?; }
mps.delete(&id)?;
} }
Some(Commands::Password) => { Some(Commands::Delete(item)) => {
let mut mps = MPS::new(); let mut mps = MPS::new();
mps.password()?; if let Some(id) = &item.id {
mps.delete(id)?
}
if let Some(number) = &item.number {
mps.delete_by_number(*number)?;
}
} }
None => { None => {
match Storage::check_installed() { match Storage::check_installed() {

7
src/storage.rs

@ -242,12 +242,5 @@ impl Storage {
Ok(()) Ok(())
} }
pub fn new_from_passphrase(&self, passphrase: &String) -> Storage {
return Storage {
encoder: Encoder::from(passphrase),
items: self.items.clone()
}
}
} }

Loading…
Cancel
Save