1use std::env;
2
3use mdict_rs::{MddFile, MdxFile};
4
5fn main() -> Result<(), Box<dyn std::error::Error>> {
6 let mut args = env::args().skip(1);
7 let mode = args
8 .next()
9 .ok_or("usage: inspect <mdx|mdd> <path> [lookup_key]")?;
10 let path = args
11 .next()
12 .ok_or("usage: inspect <mdx|mdd> <path> [lookup_key]")?;
13 let lookup_key = args.next();
14
15 match mode.as_str() {
16 "mdx" => {
17 let file = MdxFile::open(&path)?;
18 println!("entries={}", file.len());
19 println!("title={:?}", file.header().title);
20 println!(
21 "description_present={}",
22 file.header().description.is_some()
23 );
24 if let Some(key) = lookup_key {
25 match file.lookup(&key)? {
26 Some(record) => {
27 println!("key={}", record.key);
28 println!("text_prefix={}", prefix(&record.text, 200));
29 }
30 None => println!("not found"),
31 }
32 } else {
33 for entry in file.entries().take(5) {
34 let entry = entry?;
35 println!("{} => {}", entry.key, prefix(&entry.text, 80));
36 }
37 }
38 }
39 "mdd" => {
40 let file = MddFile::open(&path)?;
41 println!("entries={}", file.len());
42 println!("title={:?}", file.header().title);
43 if let Some(key) = lookup_key {
44 match file.lookup(&key)? {
45 Some(resource) => {
46 println!("key={}", resource.key);
47 println!("bytes={}", resource.data.len());
48 println!(
49 "prefix={:02x?}",
50 &resource.data[..resource.data.len().min(16)]
51 );
52 }
53 None => println!("not found"),
54 }
55 } else {
56 for entry in file.entries().take(5) {
57 let entry = entry?;
58 println!("{} => {} bytes", entry.key, entry.data.len());
59 }
60 }
61 }
62 _ => return Err("mode must be mdx or mdd".into()),
63 }
64
65 Ok(())
66}
67
68fn prefix(text: &str, max_chars: usize) -> String {
69 text.chars().take(max_chars).collect()
70}