summaryrefslogtreecommitdiffstats
path: root/bin/core/imag-store/src/retrieve.rs
diff options
context:
space:
mode:
Diffstat (limited to 'bin/core/imag-store/src/retrieve.rs')
-rw-r--r--bin/core/imag-store/src/retrieve.rs103
1 files changed, 103 insertions, 0 deletions
diff --git a/bin/core/imag-store/src/retrieve.rs b/bin/core/imag-store/src/retrieve.rs
new file mode 100644
index 00000000..19c85b16
--- /dev/null
+++ b/bin/core/imag-store/src/retrieve.rs
@@ -0,0 +1,103 @@
+//
+// imag - the personal information management suite for the commandline
+// Copyright (C) 2015, 2016 Matthias Beyer <mail@beyermatthias.de> 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::ArgMatches;
+
+use libimagstore::store::FileLockEntry;
+use libimagstore::storeid::StoreId;
+use libimagrt::runtime::Runtime;
+use libimagerror::trace::MapErrTrace;
+use libimagutil::debug_result::*;
+
+pub fn retrieve(rt: &Runtime) {
+ rt.cli()
+ .subcommand_matches("retrieve")
+ .map(|scmd| {
+ scmd.value_of("id")
+ .map(|id| {
+ let path = PathBuf::from(id);
+ let path = try!(StoreId::new(Some(rt.store().path().clone()), path)
+ .map_err_trace_exit(1));
+ debug!("path = {:?}", path);
+
+ rt.store()
+ // "id" must be present, enforced via clap spec
+ .retrieve(path)
+ .map(|e| print_entry(rt, scmd, e))
+ .map_dbg_str("No entry")
+ .map_dbg(|e| format!("{:?}", e))
+ .map_err_trace()
+ })
+ });
+}
+
+pub fn print_entry(rt: &Runtime, scmd: &ArgMatches, e: FileLockEntry) {
+ if do_print_raw(scmd) {
+ debug!("Printing raw content...");
+ println!("{}", e.to_str());
+ } else if do_filter(scmd) {
+ debug!("Filtering...");
+ warn!("Filtering via header specs is currently now supported.");
+ warn!("Will fail now!");
+ unimplemented!()
+ } else {
+ debug!("Printing structured...");
+ if do_print_header(scmd) {
+ debug!("Printing header...");
+ if do_print_header_as_json(rt.cli()) {
+ debug!("Printing header as json...");
+ warn!("Printing as JSON currently not supported.");
+ warn!("Will fail now!");
+ unimplemented!()
+ } else {
+ debug!("Printing header as TOML...");
+ println!("{}", e.get_header())
+ }
+ }
+
+ if do_print_content(scmd) {
+ debug!("Printing content...");
+ println!("{}", e.get_content());
+ }
+
+ }
+}
+
+fn do_print_header(m: &ArgMatches) -> bool {
+ m.is_present("header")
+}
+
+fn do_print_header_as_json(m: &ArgMatches) -> bool {
+ m.is_present("header-json")
+}
+
+fn do_print_content(m: &ArgMatches) -> bool {
+ m.is_present("content")
+}
+
+fn do_print_raw(m: &ArgMatches) -> bool {
+ m.is_present("raw")
+}
+
+fn do_filter(m: &ArgMatches) -> bool {
+ m.subcommand_matches("filter-header").is_some()
+}
+