lich 0.2.0

Minimal password management.
Documentation
use clap;
use common::*;
use entry;
use std::fs::OpenOptions;
use std::path::PathBuf;

pub fn run(path: PathBuf, place: &str) -> Result<(), clap::Error> {
    let mut file = OpenOptions::new()
        .read(true)
        .write(true)
        .open(&path)
        .map_err(|e| read_error(&path, e))?;

    let mut data = decode(&file, &path)?;
    let res = unlock(&mut data, |mut unlocked| {
        let password = entry::new_password();
        unlocked.set(place.to_owned(), password)
    });

    match res {
        Ok(existed) => {
            save(&mut file, &path, &data)?;

            if existed {
                println!("Updated entry for `{}`.", place);
            } else {
                println!("Created entry for `{}`.", place);
            }

            Ok(())
        }
        Err(e) => Err(write_error(&path, e))
    }
}