Skip to main content

inspect/
inspect.rs

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}