mod parse_lib;
use clap::Parser;
use std::path::Path;
use std::process::exit;
use crate::parse_lib::SortBy;
#[derive(Parser)]
#[command(version, about, long_about = None)]
struct Args {
epub_dir: String,
#[arg(short, long)]
lib_db: String,
#[arg(short, long, default_value = "date")]
sort: String,
#[arg(short, long, action = clap::ArgAction::SetTrue)]
reverse: bool,
#[arg(short, long, action = clap::ArgAction::SetTrue)]
no_save: bool,
}
fn parse_sorting_option(sort_str: &str) -> SortBy {
match sort_str.to_lowercase().as_str() {
"r" | "read" => SortBy::Read,
"t" | "title" => SortBy::Title,
"a" | "author" => SortBy::Author,
"p" | "pages" => SortBy::Pages,
"s" | "series" => SortBy::Series,
_ => SortBy::Date,
}
}
fn start(lib_db: &Path, epub_dir: &Path, sort_by: SortBy, reverse: bool, no_save: bool) -> Result<(), &'static str> {
if !lib_db.exists() {
return Err("error: unable to locate DB file");
}
if !epub_dir.exists() {
return Err("error: epub directory not found");
}
let library = parse_lib::load_library(lib_db, epub_dir, &sort_by, reverse)?;
let library_string = parse_lib::library_to_string(&library);
if !no_save {
parse_lib::write_library(&library_string, lib_db)?;
}
println!("{library_string}");
Ok(())
}
fn main() {
let args = Args::parse();
let lib_db = Path::new(&args.lib_db);
let epub_dir = Path::new(&args.epub_dir);
let sort_by = parse_sorting_option(&args.sort);
if let Err(error_msg) = start(lib_db, epub_dir, sort_by, args.reverse, args.no_save) {
eprintln!("txlib: {error_msg}");
exit(1);
}
}