logoxide-cli 0.1.1

lx, logoxide's command line: Bibles, commentaries, lexicons, books, and media as versioned packages
//! `lx map`: a reference in another numbering

use std::{path::PathBuf, sync::Arc};

use logoxide::reader::DefaultReader;
use logoxide::{Features, FsStorage, Package};

use crate::cli::Cli;

/// Prints where a reference is in another numbering, and its verses that have no counterpart
pub(crate) fn map(
    cli: &Cli,
    reference: &str,
    from: &str,
    to: &str,
    with: &[PathBuf],
) -> logoxide::Result<()> {
    use logoxide_text::versification::parse_reference;
    let library = cli.library();
    let project = cli.project(&library)?;
    let mut maps = project.versifications(&library)?;
    for dir in with {
        let package = Package::open(Arc::new(FsStorage::new(dir)), Features::default())?;
        maps.add(logoxide::reader::versification_map(&package)?);
    }
    let passage = parse_reference(reference)?;
    let (from, to) = (
        project.numbering(&library, &DefaultReader, from)?,
        project.numbering(&library, &DefaultReader, to)?,
    );
    let counts = from.counts.get(&passage.book);
    let mapped = maps.map(&passage, &from.versification, &to.versification, counts)?;
    match mapped.verses.is_empty() {
        true => outln!("(no counterpart in {})", to.versification),
        false => outln!("{} ({})", mapped.text(), to.versification),
    }
    if !mapped.missing.is_empty() {
        outln!(
            "not in {}: {} ({})",
            to.versification,
            mapped.missing_text(),
            from.versification
        );
    }
    Ok(())
}