mdict-rs 0.1.4

Library-first Rust parser for MDict .mdx and .mdd dictionaries
Documentation
use std::env;

use mdict_rs::{MddFile, MdxFile};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut args = env::args().skip(1);
    let mode = args
        .next()
        .ok_or("usage: inspect <mdx|mdd> <path> [lookup_key]")?;
    let path = args
        .next()
        .ok_or("usage: inspect <mdx|mdd> <path> [lookup_key]")?;
    let lookup_key = args.next();

    match mode.as_str() {
        "mdx" => {
            let file = MdxFile::open(&path)?;
            println!("entries={}", file.len());
            println!("title={:?}", file.header().title);
            println!(
                "description_present={}",
                file.header().description.is_some()
            );
            if let Some(key) = lookup_key {
                match file.lookup(&key)? {
                    Some(record) => {
                        println!("key={}", record.key);
                        println!("text_prefix={}", prefix(&record.text, 200));
                    }
                    None => println!("not found"),
                }
            } else {
                for entry in file.entries().take(5) {
                    let entry = entry?;
                    println!("{} => {}", entry.key, prefix(&entry.text, 80));
                }
            }
        }
        "mdd" => {
            let file = MddFile::open(&path)?;
            println!("entries={}", file.len());
            println!("title={:?}", file.header().title);
            if let Some(key) = lookup_key {
                match file.lookup(&key)? {
                    Some(resource) => {
                        println!("key={}", resource.key);
                        println!("bytes={}", resource.data.len());
                        println!(
                            "prefix={:02x?}",
                            &resource.data[..resource.data.len().min(16)]
                        );
                    }
                    None => println!("not found"),
                }
            } else {
                for entry in file.entries().take(5) {
                    let entry = entry?;
                    println!("{} => {} bytes", entry.key, entry.data.len());
                }
            }
        }
        _ => return Err("mode must be mdx or mdd".into()),
    }

    Ok(())
}

fn prefix(text: &str, max_chars: usize) -> String {
    text.chars().take(max_chars).collect()
}