// // imag - the personal information management suite for the commandline // Copyright (C) 2015-2019 Matthias Beyer and contributors // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; version // 2.1 of the License. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // use std::path::PathBuf; use clap::{Arg, ArgMatches}; use libimagstore::storeid::StoreId; use failure::err_msg; use failure::Fallible as Result; pub fn id_argument<'a, 'b>() -> Arg<'a, 'b> { Arg::with_name(id_argument_name()) .short(id_argument_short()) .long(id_argument_long()) .takes_value(true) .multiple(true) .help("Specify the Store-Id") } pub fn id_argument_name() -> &'static str { "id-argument" } pub fn id_argument_short() -> &'static str { "i" } pub fn id_argument_long() -> &'static str { "id" } pub fn get_id(matches: &ArgMatches) -> Result> { matches .values_of(id_argument_name()) .ok_or_else(|| err_msg("CLI error")) .and_then(|vals| { vals .fold(Ok(vec![]), |acc, elem| { acc.and_then(|mut v| { let elem = StoreId::new(PathBuf::from(String::from(elem)))?; v.push(elem); Ok(v) }) }) }) } pub fn get_or_select_id(matches: &ArgMatches, store_path: &PathBuf) -> Result> { use interactor::{pick_file, default_menu_cmd}; get_id(matches) .or_else(|_| { let path = store_path.clone(); let p = pick_file(default_menu_cmd, path)?; let id = StoreId::new(p)?; Ok(vec![id]) }) }