txlib 0.2.1

text based epub library
mod parse_lib;

use clap::Parser;
use std::path::Path;
use std::process::exit;

use crate::parse_lib::SortBy;

/// txlib: text based epub library management
#[derive(Parser)]
#[command(version, about, long_about = None)]
struct Args {
    /// Root directory containing epub files
    epub_dir: String,
    /// File path to read/store epub library data
    #[arg(short, long)]
    lib_db: String,
    /// Sort by: date, title, author, pages or series
    #[arg(short, long, default_value = "date")]
    sort: String,
    /// Reverse sorting order
    #[arg(short, long, action = clap::ArgAction::SetTrue)]
    reverse: bool,
    /// Print output without saving to DB
    #[arg(short, long, action = clap::ArgAction::SetTrue)]
    no_save: bool,
}

/// Returns `SortBy` enum after parsing string sorting option.
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);
    }
}