kitab

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

commit 0cc98ffec7f6b7c562ad5c8c929dcb90c3620487
parent 0d5bb2ccf50e0818596c23ddd4419d73875f4a48
Author: lash <dev@holbrook.no>
Date:   Wed, 27 Jul 2022 09:10:56 +0000

Complete docs

Diffstat:
Msrc/biblatex.rs | 7+++++++
Msrc/dc/mod.rs | 16++++++++++++++--
Msrc/lib.rs | 28+++++++++++++++++++++++++---
Msrc/main.rs | 25+++++++++----------------
Msrc/store.rs | 3+++
5 files changed, 58 insertions(+), 21 deletions(-)

diff --git a/src/biblatex.rs b/src/biblatex.rs @@ -42,6 +42,13 @@ fn parse_digest(entry: &Entry) -> Vec<u8> { digest } +/// Read one or more metadata entries from the `bibtex` source. +/// +/// Will return `ParseError` if any of the records are invalid. +/// +/// # Arguments +/// +/// * `r` - reader implementation providing the source. pub fn read_all(mut r: impl Read) -> Result<Vec<MetaData>, ParseError> { let mut s = String::new(); let c = r.read_to_string(&mut s); diff --git a/src/dc/mod.rs b/src/dc/mod.rs @@ -4,12 +4,20 @@ use biblatex::EntryType; use std::str::FromStr; +/// Represents the parts of the metadata schema covered by the Dublin Core vocabulary. pub struct DCMetaData { + /// Title of work represented by media. pub title: String, + /// Author(s) of work represented by media. Multiple authors may be specified by separating + /// them with comma. pub author: String, + /// Type of work represented by media. Maps to bibtex entry types. pub typ: EntryType, + /// Comma-separated keyword list describing the content. pub subject: Option<String>, + /// MIME type of the media. pub mime: Option<Mime>, + /// What language the work represented by this media file is in. pub language: Option<LanguageIdentifier>, } @@ -27,11 +35,15 @@ pub const DC_XATTR_TYPE: &str = "user.dcterms:type"; pub const DC_XATTR_MEDIATYPE: &str = "user.dcterms:MediaType"; impl DCMetaData { - pub fn new(title: &str, author: &str, typ: EntryType) -> DCMetaData { + /// Creates a new Dublin Core metadata part with minimal data. + /// + /// `title`, `author` and `entry_type` map to corresponding [DCMetaData](DCMetaData) + /// properties. + pub fn new(title: &str, author: &str, entry_type: EntryType) -> DCMetaData { DCMetaData{ title: String::from(title), author: String::from(author), - typ: typ, + typ: entry_type, subject: None, mime: None, language: None, diff --git a/src/lib.rs b/src/lib.rs @@ -1,12 +1,28 @@ -//! kitab is a CLI tool to manage backup of media metadata information, primarily for +//! kitab is a CLI tool to manage backup of media metadata information, primarily intended for //! bibliographical sources. //! //! The tool can recursively apply metadata as extended attributes on all files in a filesystem //! location whose digests match the respective keys of the metadata. //! //! Also, metadata can be imported from the same extended file attributes, as well as -//! [bibtex](http://www.bibtex.org/Format/) and -//! kitab's native store format. +//! files containing [bibtex](http://www.bibtex.org/Format/) entries and +//! entries in kitab's native store format. +//! +//! ## Usage examples +//! +//! ``` ignore; +//! ## import rdf-turtle entries from file to store. +//! $ kitab import source.ttl +//! +//! ## import bibtex entries from file to store +//! $ kitab import source.bib +//! +//! ## import entries from any valid source under the given path +//! $ kitab import /path/to/metadata_and_or_media_files +//! +//! ## apply metadata on files matching digests in store +//! $ kitab apply /path/to/media_files +//! ``` //! //! ## Native store format //! @@ -20,6 +36,7 @@ //! <URN:sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae> predicate object //! [...] //! ``` +//! Please forgive the lack of a schema describing the data. It will follow. //! //! ## Store location //! @@ -74,6 +91,11 @@ //! //! Without the `magic` feature, the `dcterms.MediaType` will not be included in the metadata //! record. +//! +//! ## Debugging +//! +//! `kitab` uses [env_logger](env_logger). Loglevel can be set using the +//! `RUST_LOG` environment variable to see what's going on when running the tool. #![crate_name = "kitab"] pub mod meta; diff --git a/src/main.rs b/src/main.rs @@ -44,13 +44,6 @@ 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") @@ -64,18 +57,18 @@ fn args_setup() -> ArgMatches<'static> { ); o = o.subcommand(o_import); - let mut o_scan = ( - SubCommand::with_name("scan") + let mut o_apply = ( + SubCommand::with_name("apply") .about("import information from file") .version("0.0.1") ); - o_scan = o_scan.arg( + o_apply = o_apply.arg( Arg::with_name("PATH") .help("Path to operate on") .required(true) .index(1) ); - o = o.subcommand(o_scan); + o = o.subcommand(o_apply); o.get_matches() } @@ -83,7 +76,7 @@ fn args_setup() -> ArgMatches<'static> { // commands // kitab import <file> - attempt in order import rdf, import spec // kitab export <file> - export rdf/turtle - // kitab scan <path> - recursively + // kitab apply <path> - recursively fn resolve_directory(args: &ArgMatches) -> PathBuf { match BaseDirs::new() { @@ -188,7 +181,7 @@ fn exec_import_biblatex(f: &Path, index_path: &Path) -> bool { true } -fn exec_scan(p: &Path, index_path: &Path) -> bool { +fn exec_apply(p: &Path, index_path: &Path) -> bool { for entry in WalkDir::new(&p) .into_iter() .filter_map(Result::ok) @@ -251,11 +244,11 @@ fn main() { } let mut r = true; - match args.subcommand_matches("scan") { + match args.subcommand_matches("apply") { Some(v) => { let p = str_to_path(v); - info!("scan from path {:?}", &p); - if !exec_scan(p.as_path(), index_dir.as_path()) { + info!("apply from path {:?}", &p); + if !exec_apply(p.as_path(), index_dir.as_path()) { r = false; } }, diff --git a/src/store.rs b/src/store.rs @@ -7,17 +7,20 @@ use std::fs::File; use crate::meta::MetaData; +/// Represents the filesystem storage location for metadata. pub struct FileStore{ path: PathBuf, } impl FileStore { + /// Create new store. pub fn new(p: &Path) -> Self { FileStore{ path: p.to_path_buf(), } } + /// Generate new writer for adding / modifying a metadata entry in the store. pub fn writer(&self, entry: &MetaData) -> impl Write { let p = self.path.join(entry.fingerprint()); File::create(&p).unwrap()