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()
}