km 0.1.0

Knowledge manager from the command line. It contains `km add`, `km update`, `km open`, and `km del`.
Documentation
use clap::{App, Arg};
use km::*;
fn main() {
    let app_m = App::new("Knowledge management Program")
        .version(crate_version!())
        .author("brian")
        .about("Knowledge Manager")
        .arg(
            Arg::new("list")
                .short('l')
                .long("list")
                .takes_value(false)
                .help("List all the tags"),
        )
        .subcommand(
            App::new("init")
                .about(
                    "init storage db",
                )
                .version(crate_version!())
        )
        .subcommand(
            App::new("open")
                .about(
                    "open mark by tag",
                )
                .version(crate_version!())
                .arg(
                    Arg::new("TAG")
                        .required(true)
                        .index(1)
                        .help("Open mark for this tag"),
                ),
        )
        .subcommand(
            App::new("add")
                .about("add new mark")
                .version(km::crate_version!())
                .arg(Arg::new("TAG").required(true).index(1).help("Set the tag"))
                .arg(
                    Arg::new("MARK")
                        .required(true)
                        .index(2)
                        .help("Set the mark"),
                ),
        )
        .subcommand(
            App::new("del")
                .about("delete a mark")
                .version(km::crate_version!())
                .arg(
                    Arg::new("TAG")
                        .required(true)
                        .index(1)
                        .help("delete the mark for this tag"),
                ),
        )
        .subcommand(
            App::new("update")
                .about("update tag")
                .version(km::crate_version!())
                .arg(
                    Arg::new("OLDTAG")
                        .required(true)
                        .index(1)
                        .help("set old tag")
                )
                .arg(
                    Arg::new("NEWTAG")
                        .required(true)
                        .index(2)
                        .help("Set new tag"),
                ),
        )
        .get_matches();

    if app_m.is_present("list") {
        println!("List all tags:");
        match read_tags() {
            Err(why) => print!("Read tags failed. {:?}", why),
            Ok(tags) => {
                for tag in tags {
                    println!("........ {}", tag);
                }
            }
        }

    }

    match app_m.subcommand() {
        Some(("init", _sub_m)) => { 
            println!("Init the storage DB: "); 
            init_storage().expect("Init storage");
        }
        Some(("open", sub_m)) => {
            if let Some(tag) = sub_m.value_of("TAG") {
                match read_mark(tag) {
                    Err(why) => println!("Read mark for {} failed. {}", tag, why),
                    Ok(mark) => match open::that(&mark) {
                        Ok(()) => println!("Open {} success.", &mark),
                        Err(err) => eprintln!("Error occurred when open {}: {}", &mark, err)
                    }
                }
            }
        }
        Some(("add", sub_m)) => {
            if let Some(tag) = sub_m.value_of("TAG") {
                if let Some(mark) = sub_m.value_of("MARK") {
                    match add_mark(tag, mark) {
                        Ok(()) => println!("Add {}:{} success.",tag, mark),
                        Err(why) => println!("Add mark for {} failed. {}", tag, why),
                    }
                }
            }
        }
        Some(("del", sub_m)) => {
            if let Some(tag) = sub_m.value_of("TAG") {
                    match del_mark(tag) {
                        Ok(()) => println!("{} deleted.",tag),
                        Err(why) => println!("Delete mark for {} failed. {}", tag, why),
                    }
            }
        }
        Some(("update", sub_m)) => {
            if let Some(tag) = sub_m.value_of("OLDTAG") {
                if let Some(newtag) = sub_m.value_of("NEWTAG") {
                    match update_mark(tag, newtag) {
                        Ok(()) => println!("Update tag {}:{} success.",tag, newtag),
                        Err(why) => println!("Update tag for {} failed. {}", tag, why),
                    }
                }
            }
        }

        _ => {}
    }
}