Move imag-view to ID provider infrastructure

This commit is contained in:
Matthias Beyer 2018-10-04 18:37:40 +02:00
parent f83d72033f
commit 274811243f
2 changed files with 53 additions and 66 deletions

View file

@ -49,8 +49,6 @@ extern crate libimagutil;
use std::str::FromStr; use std::str::FromStr;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::io::Write; use std::io::Write;
use std::io::Read;
use std::path::PathBuf;
use std::process::Command; use std::process::Command;
use std::process::exit; use std::process::exit;
@ -83,9 +81,19 @@ fn main() {
"View entries (readonly)", "View entries (readonly)",
build_ui); build_ui);
let entry_ids = entry_ids(&rt);
let view_header = rt.cli().is_present("view-header"); let view_header = rt.cli().is_present("view-header");
let hide_content = rt.cli().is_present("not-view-content"); let hide_content = rt.cli().is_present("not-view-content");
let entry_ids = rt.ids::<::ui::PathProvider>()
.map_err_trace_exit_unwrap(1)
.into_iter()
.map(|x| Ok(x) as Result<_, StoreError>)
.into_get_iter(rt.store())
.trace_unwrap_exit(1)
.map(|e| {
e.ok_or_else(|| String::from("Entry not found"))
.map_err(StoreError::from)
.map_err_trace_exit_unwrap(1)
});
if rt.cli().is_present("in") { if rt.cli().is_present("in") {
let files = entry_ids let files = entry_ids
@ -198,17 +206,19 @@ fn main() {
let viewer = MarkdownViewer::new(&rt); let viewer = MarkdownViewer::new(&rt);
let seperator = basesep.map(|s| build_seperator(s, sep_width)); let seperator = basesep.map(|s| build_seperator(s, sep_width));
for (n, entry) in iter.enumerate() { entry_ids
if n != 0 { .enumerate()
seperator .for_each(|(n, entry)| {
.as_ref() if n != 0 {
.map(|s| writeln!(outlock, "{}", s).to_exit_code().unwrap_or_exit()); seperator
} .as_ref()
.map(|s| writeln!(outlock, "{}", s).to_exit_code().unwrap_or_exit());
}
viewer viewer
.view_entry(&entry, &mut outlock) .view_entry(&entry, &mut outlock)
.map_err_trace_exit_unwrap(1); .map_err_trace_exit_unwrap(1);
} });
} else { } else {
let mut viewer = StdoutViewer::new(view_header, !hide_content); let mut viewer = StdoutViewer::new(view_header, !hide_content);
@ -228,48 +238,19 @@ fn main() {
} }
let seperator = basesep.map(|s| build_seperator(s, sep_width)); let seperator = basesep.map(|s| build_seperator(s, sep_width));
for (n, entry) in iter.enumerate() { entry_ids
if n != 0 { .enumerate()
seperator .for_each(|(n, entry)| {
.as_ref() if n != 0 {
.map(|s| writeln!(outlock, "{}", s).to_exit_code().unwrap_or_exit()); seperator
} .as_ref()
.map(|s| writeln!(outlock, "{}", s).to_exit_code().unwrap_or_exit());
}
viewer viewer
.view_entry(&entry, &mut outlock) .view_entry(&entry, &mut outlock)
.map_err_trace_exit_unwrap(1); .map_err_trace_exit_unwrap(1);
} });
}
}
}
fn entry_ids(rt: &Runtime) -> StoreIdIterator {
match rt.cli().values_of("id") {
Some(p) => {
let pathes : Vec<String> = p.map(String::from).collect();
let iter = pathes.into_iter().map(PathBuf::from).map(PathBuf::into_storeid);
StoreIdIterator::new(Box::new(iter))
},
None => if rt.cli().is_present("entries-from-stdin") {
let stdin = rt.stdin().unwrap_or_else(|| {
error!("Cannot get handle to stdin");
::std::process::exit(1)
});
let mut buf = String::new();
let _ = stdin.lock().read_to_string(&mut buf).unwrap_or_else(|_| {
error!("Failed to read from stdin");
::std::process::exit(1)
});
let lines : Vec<String> = buf.lines().map(String::from).collect();
let iter = lines.into_iter().map(PathBuf::from).map(PathBuf::into_storeid);
StoreIdIterator::new(Box::new(iter))
} else {
error!("Something weird happened. I was not able to find the path of the entries to edit");
::std::process::exit(1)
} }
} }
} }

View file

@ -17,17 +17,17 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
// //
use clap::{Arg, ArgGroup, App}; use std::path::PathBuf;
use clap::{Arg, ArgMatches, App};
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> { pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
app app
.arg(Arg::with_name("entries-from-stdin")
.long("ids-from-stdin")
.short("I")
.required(false)
.multiple(true)
.help("The entry/entries are piped in via stdin"))
.arg(Arg::with_name("id") .arg(Arg::with_name("id")
.index(1) .index(1)
.takes_value(true) .takes_value(true)
@ -36,10 +36,6 @@ pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
.help("View these entries at this store path") .help("View these entries at this store path")
.value_name("IDs")) .value_name("IDs"))
.group(ArgGroup::with_name("input-method")
.args(&["id", "entries-from-stdin"])
.required(true))
.arg(Arg::with_name("autowrap") .arg(Arg::with_name("autowrap")
.long("autowrap") .long("autowrap")
.short("w") .short("w")
@ -91,3 +87,13 @@ pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
.help("View content. If no value is given, this fails. Possible viewers are configured via the config file.")) .help("View content. If no value is given, this fails. Possible viewers are configured via the config file."))
} }
pub struct PathProvider;
impl IdPathProvider for PathProvider {
fn get_ids(matches: &ArgMatches) -> Vec<StoreId> {
matches.values_of("id")
.unwrap()
.map(|s| PathBuf::from(s).into_storeid().map_err_trace_exit_unwrap(1))
.collect()
}
}