kitab

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | LICENSE

commit 25b7cceabdfa9b0ce5af16b2fcc0aad41f1762e4
parent bcbc817d44f5ca0e0d8e59521b29ba521f857959
Author: lash <dev@holbrook.no>
Date:   Sun, 26 Jun 2022 19:32:19 +0000

Add main, return metadata from rdf read

Diffstat:
MCargo.toml | 6++++++
Asrc/main.rs | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/rdf.rs | 3++-
3 files changed, 130 insertions(+), 1 deletion(-)

diff --git a/Cargo.toml b/Cargo.toml @@ -6,6 +6,10 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +name = "kitab" +path = "src/lib.rs" + [dependencies] xattr = "0.2.2" #inotify = "0.8.0" @@ -21,6 +25,8 @@ log = "^0.4" env_logger = "^0.9" urn = "^0.4.0" #tempfile = "^3.3.0" +clap = "^2.34.0" +directories = "^4.0.1" [dev-dependencies] tempfile = "^3.3.0" diff --git a/src/main.rs b/src/main.rs @@ -0,0 +1,122 @@ +use std::default; +use std::fs::File; +use std::path::{ + Path, + PathBuf, +}; +use env_logger; +use clap::{ + App, + Arg, + ArgMatches, + SubCommand, +}; +use directories::{ + BaseDirs, +}; +use log::{ + debug, + info, +}; + +#[cfg(feature = "rdf")] +use kitab::rdf::read as rdf_read; + + +fn args_setup() -> ArgMatches<'static> { + let mut o = App::new("kitab"); + o = o.version("0.0.1"); + o = o.author("Louis Holbrook <dev@holbrook.no>"); + o = o.arg( + Arg::with_name("file") + .long("file") + .short("f") + .value_name("File to match records against") + .takes_value(true) + ); + let mut o_import = ( + SubCommand::with_name("import") + .about("import information from file") + .version("0.0.1") + ); + o_import = o_import.arg( + Arg::with_name("PATH") + .help("Path to operate on") + .required(true) + .index(1) + ); + + o = o.subcommand(o_import); + + o.get_matches() +} + +// commands +// kitab import <file> - attempt in order import rdf, import spec +// kitab export <file> - export rdf/turtle +// kitab scan <path> - recursively + +fn resolve_directory(args: &ArgMatches) -> PathBuf { + match BaseDirs::new() { + Some(v) => { + let d = v.data_dir(); + d.join("kitab") + .join("idx") + }, + _ => { + PathBuf::from(".") + .join(".kitab") + .join("/idx") + }, + } +} + +fn str_to_path(args: &ArgMatches) -> PathBuf { + let mut p_canon: PathBuf; + match args.value_of("PATH") { + Some(v) => { + let p = &Path::new(v); + match p.canonicalize() { + Ok(v) => { + p_canon = v.clone(); + }, + Err(e) => { + panic!("path error: {}", e); + }, + }; + }, + None => { + panic!("path required"); + }, + } + p_canon +} + +fn exec_import(f: &Path, index_path: &Path) { + #[cfg(feature = "rdf")] + { + let f = File::open(f).unwrap(); + let m = rdf_read(&f); + + let fp = index_path.join(m.fingerprint()); + debug!("writing record for title {} to {:?}", m.title(), &fp); + } +} + +fn main() { + env_logger::init(); + + let args = args_setup(); + + let index_dir = resolve_directory(&args); + info!("have index directory {:?}", &index_dir); + + match args.subcommand_matches("import") { + Some(v) => { + let p = str_to_path(v); + info!("have path {:?}", &p); + return exec_import(p.as_path(), index_dir.as_path()); + }, + _ => {}, + } +} diff --git a/src/rdf.rs b/src/rdf.rs @@ -170,7 +170,7 @@ fn handle_parse_match(metadata: &mut MetaData, triple: Triple) -> Result<(), Rdf Ok(()) } -pub fn read(r: impl Read) { +pub fn read(r: impl Read) -> MetaData { let mut metadata = MetaData::empty(); let bf = BufReader::new(r); let mut tp = TurtleParser::new(bf, None); @@ -183,6 +183,7 @@ pub fn read(r: impl Read) { } Ok(()) }); + metadata } #[cfg(test)]