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:
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)]