summaryrefslogtreecommitdiffstats
path: root/bin/core/imag-ref/src/ui.rs
diff options
context:
space:
mode:
Diffstat (limited to 'bin/core/imag-ref/src/ui.rs')
-rw-r--r--bin/core/imag-ref/src/ui.rs108
1 files changed, 99 insertions, 9 deletions
diff --git a/bin/core/imag-ref/src/ui.rs b/bin/core/imag-ref/src/ui.rs
index e7d714ee..c14eafe2 100644
--- a/bin/core/imag-ref/src/ui.rs
+++ b/bin/core/imag-ref/src/ui.rs
@@ -17,19 +17,34 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
-use clap::{Arg, App, SubCommand};
+use std::path::PathBuf;
+
+use clap::{Arg, App, ArgMatches, SubCommand};
+
+use libimagstore::storeid::StoreId;
+use libimagstore::storeid::IntoStoreId;
+use libimagrt::runtime::IdPathProvider;
+use libimagerror::trace::MapErrTrace;
pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
app
.subcommand(SubCommand::with_name("deref")
- .about("'Dereference' a ref. This prints the Path of the referenced file")
+ .about("'Dereference a ref. This prints the Path(es) of the referenced file(s)")
.version("0.1")
.arg(Arg::with_name("ID")
.index(1)
.takes_value(true)
- .required(true)
- .help("The id of the store entry to dereference")
+ .required(false)
+ .multiple(true)
+ .help("The id of the store entry to dereference.")
.value_name("ID"))
+
+ .arg(Arg::with_name("ignore-noref")
+ .long("ignore-noref")
+ .takes_value(false)
+ .required(false)
+ .multiple(false)
+ .help("Ignore store entries which are not refs and do not print error message"))
)
.subcommand(SubCommand::with_name("remove")
@@ -38,14 +53,89 @@ pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
.arg(Arg::with_name("ID")
.index(1)
.takes_value(true)
- .required(true)
+ .required(false)
.multiple(true)
.help("Remove the reference from this store entry")
.value_name("ENTRIES"))
- .arg(Arg::with_name("yes")
- .long("yes")
- .short("y")
- .help("Don't ask whether this really should be done"))
+ .arg(Arg::with_name("ignore-noref")
+ .long("ignore-noref")
+ .takes_value(false)
+ .required(false)
+ .multiple(false)
+ .help("Ignore store entries which are not refs and do not print error message"))
)
+
+ .subcommand(SubCommand::with_name("create")
+ .about("Create a reference to a file")
+ .version("0.1")
+ .arg(Arg::with_name("ID")
+ .index(1)
+ .takes_value(true)
+ .required(true)
+ .multiple(false)
+ .help("Create a reference with that ID in the store. If the store id exists, it will be made into a reference.")
+ .value_name("ID"))
+
+ .arg(Arg::with_name("path")
+ .index(2)
+ .takes_value(true)
+ .required(true)
+ .multiple(false)
+ .help("The path to refer to. If there is no basepath configuration in the config file for the path this file is located at, the operation will error.")
+ .value_name("ID"))
+
+ .arg(Arg::with_name("force")
+ .long("force")
+ .takes_value(false)
+ .required(false)
+ .multiple(false)
+ .help("Use force to override existing references"))
+ )
+}
+
+pub struct PathProvider;
+impl IdPathProvider for PathProvider {
+ fn get_ids(matches: &ArgMatches) -> Vec<StoreId> {
+ match matches.subcommand() {
+ ("deref", Some(subm)) => {
+ subm.values_of("ID")
+ .ok_or_else(|| {
+ error!("No StoreId found");
+ ::std::process::exit(1)
+ })
+ .unwrap()
+ .into_iter()
+ .map(PathBuf::from)
+ .map(|pb| pb.into_storeid())
+ .collect::<Result<Vec<_>, _>>()
+ .map_err_trace_exit_unwrap()
+ },
+
+ ("remove", Some(subm)) => {
+ subm.values_of("ID")
+ .ok_or_else(|| {
+ error!("No StoreId found");
+ ::std::process::exit(1)
+ })
+ .unwrap()
+ .into_iter()
+ .map(PathBuf::from)
+ .map(|pb| pb.into_storeid())
+ .collect::<Result<Vec<_>, _>>()
+ .map_err_trace_exit_unwrap()
+ },
+
+ ("create", _) => {
+ error!("Command does not get IDs as input");
+ ::std::process::exit(1)
+ },
+
+
+ (other, _) => {
+ error!("Not a known command: {}", other);
+ ::std::process::exit(1)
+ }
+ }
+ }
}