pub struct MddFile { /* private fields */ }Expand description
Opened .mdd resource dictionary file.
Implementations§
Source§impl MddFile
impl MddFile
Sourcepub fn open(path: impl AsRef<Path>) -> Result<Self>
pub fn open(path: impl AsRef<Path>) -> Result<Self>
Opens an MDD file with default options.
Examples found in repository?
examples/inspect.rs (line 40)
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}More examples
examples/bench_local.rs (line 51)
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let mut args = env::args().skip(1);
8 let mdx_path = args
9 .next()
10 .ok_or("usage: bench_local <mdx_path> <mdd_path>")?;
11 let mdd_path = args
12 .next()
13 .ok_or("usage: bench_local <mdx_path> <mdd_path>")?;
14
15 let open_start = Instant::now();
16 let mdx = MdxFile::open(&mdx_path)?;
17 let mdx_open = open_start.elapsed();
18
19 let queries = ["apple", "book", "zebra", "Apple"];
20 let lookup_start = Instant::now();
21 let mut total_chars = 0usize;
22 for query in queries {
23 let record = mdx.lookup(query)?.ok_or("missing benchmark MDX key")?;
24 total_chars += record.text.len();
25 }
26 let mdx_lookup = lookup_start.elapsed();
27
28 let key_scan_start = Instant::now();
29 let mut mdx_key_count = 0usize;
30 let mut mdx_key_bytes = 0usize;
31 for key in mdx.keys() {
32 let key = key?;
33 mdx_key_count += 1;
34 mdx_key_bytes += key.len();
35 }
36 let mdx_key_scan = key_scan_start.elapsed();
37
38 let entry_scan_start = Instant::now();
39 let mut mdx_entry_count = 0usize;
40 let mut mdx_entry_key_bytes = 0usize;
41 let mut mdx_entry_text_bytes = 0usize;
42 for entry in mdx.entries() {
43 let entry = entry?;
44 mdx_entry_count += 1;
45 mdx_entry_key_bytes += entry.key.len();
46 mdx_entry_text_bytes += entry.text.len();
47 }
48 let mdx_entry_scan = entry_scan_start.elapsed();
49
50 let open_start = Instant::now();
51 let mdd = MddFile::open(&mdd_path)?;
52 let mdd_open = open_start.elapsed();
53
54 let lookup_start = Instant::now();
55 let css = mdd
56 .lookup("\\LM5style.css")?
57 .ok_or("missing benchmark MDD key")?;
58 let mdd_lookup = lookup_start.elapsed();
59
60 let key_scan_start = Instant::now();
61 let mut mdd_key_count = 0usize;
62 let mut mdd_key_bytes = 0usize;
63 for key in mdd.keys() {
64 let key = key?;
65 mdd_key_count += 1;
66 mdd_key_bytes += key.len();
67 }
68 let mdd_key_scan = key_scan_start.elapsed();
69
70 let entry_scan_start = Instant::now();
71 let mut mdd_entry_count = 0usize;
72 let mut mdd_entry_key_bytes = 0usize;
73 let mut mdd_entry_data_bytes = 0usize;
74 for entry in mdd.entries() {
75 let entry = entry?;
76 mdd_entry_count += 1;
77 mdd_entry_key_bytes += entry.key.len();
78 mdd_entry_data_bytes += entry.data.len();
79 }
80 let mdd_entry_scan = entry_scan_start.elapsed();
81
82 println!("mdx_open_ms={}", mdx_open.as_millis());
83 println!("mdx_lookup_ms_total={}", mdx_lookup.as_millis());
84 println!(
85 "mdx_lookup_ms_avg={:.2}",
86 mdx_lookup.as_secs_f64() * 1000.0 / queries.len() as f64
87 );
88 println!("mdx_total_chars={total_chars}");
89 println!("mdx_keys_scan_ms_total={}", mdx_key_scan.as_millis());
90 println!("mdx_keys_scan_count={mdx_key_count}");
91 println!("mdx_keys_scan_total_bytes={mdx_key_bytes}");
92 println!("mdx_entries_scan_ms_total={}", mdx_entry_scan.as_millis());
93 println!("mdx_entries_scan_count={mdx_entry_count}");
94 println!("mdx_entries_scan_key_bytes={mdx_entry_key_bytes}");
95 println!("mdx_entries_scan_text_bytes={mdx_entry_text_bytes}");
96 println!("mdd_open_ms={}", mdd_open.as_millis());
97 println!("mdd_lookup_ms_total={}", mdd_lookup.as_millis());
98 println!("mdd_css_bytes={}", css.data.len());
99 println!("mdd_keys_scan_ms_total={}", mdd_key_scan.as_millis());
100 println!("mdd_keys_scan_count={mdd_key_count}");
101 println!("mdd_keys_scan_total_bytes={mdd_key_bytes}");
102 println!("mdd_entries_scan_ms_total={}", mdd_entry_scan.as_millis());
103 println!("mdd_entries_scan_count={mdd_entry_count}");
104 println!("mdd_entries_scan_key_bytes={mdd_entry_key_bytes}");
105 println!("mdd_entries_scan_data_bytes={mdd_entry_data_bytes}");
106
107 Ok(())
108}Sourcepub fn open_with_options(
path: impl AsRef<Path>,
options: OpenOptions,
) -> Result<Self>
pub fn open_with_options( path: impl AsRef<Path>, options: OpenOptions, ) -> Result<Self>
Opens an MDD file with explicit options.
Sourcepub fn header(&self) -> &Header
pub fn header(&self) -> &Header
Returns the parsed top-level header metadata.
Examples found in repository?
examples/inspect.rs (line 42)
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}Sourcepub fn len(&self) -> u64
pub fn len(&self) -> u64
Returns the number of resource entries declared by the file.
Examples found in repository?
examples/inspect.rs (line 41)
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}Sourcepub fn lookup(&self, key: &str) -> Result<Option<MddResource>>
pub fn lookup(&self, key: &str) -> Result<Option<MddResource>>
Performs a lazy lookup for a single resource key.
Examples found in repository?
examples/inspect.rs (line 44)
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}More examples
examples/bench_local.rs (line 56)
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let mut args = env::args().skip(1);
8 let mdx_path = args
9 .next()
10 .ok_or("usage: bench_local <mdx_path> <mdd_path>")?;
11 let mdd_path = args
12 .next()
13 .ok_or("usage: bench_local <mdx_path> <mdd_path>")?;
14
15 let open_start = Instant::now();
16 let mdx = MdxFile::open(&mdx_path)?;
17 let mdx_open = open_start.elapsed();
18
19 let queries = ["apple", "book", "zebra", "Apple"];
20 let lookup_start = Instant::now();
21 let mut total_chars = 0usize;
22 for query in queries {
23 let record = mdx.lookup(query)?.ok_or("missing benchmark MDX key")?;
24 total_chars += record.text.len();
25 }
26 let mdx_lookup = lookup_start.elapsed();
27
28 let key_scan_start = Instant::now();
29 let mut mdx_key_count = 0usize;
30 let mut mdx_key_bytes = 0usize;
31 for key in mdx.keys() {
32 let key = key?;
33 mdx_key_count += 1;
34 mdx_key_bytes += key.len();
35 }
36 let mdx_key_scan = key_scan_start.elapsed();
37
38 let entry_scan_start = Instant::now();
39 let mut mdx_entry_count = 0usize;
40 let mut mdx_entry_key_bytes = 0usize;
41 let mut mdx_entry_text_bytes = 0usize;
42 for entry in mdx.entries() {
43 let entry = entry?;
44 mdx_entry_count += 1;
45 mdx_entry_key_bytes += entry.key.len();
46 mdx_entry_text_bytes += entry.text.len();
47 }
48 let mdx_entry_scan = entry_scan_start.elapsed();
49
50 let open_start = Instant::now();
51 let mdd = MddFile::open(&mdd_path)?;
52 let mdd_open = open_start.elapsed();
53
54 let lookup_start = Instant::now();
55 let css = mdd
56 .lookup("\\LM5style.css")?
57 .ok_or("missing benchmark MDD key")?;
58 let mdd_lookup = lookup_start.elapsed();
59
60 let key_scan_start = Instant::now();
61 let mut mdd_key_count = 0usize;
62 let mut mdd_key_bytes = 0usize;
63 for key in mdd.keys() {
64 let key = key?;
65 mdd_key_count += 1;
66 mdd_key_bytes += key.len();
67 }
68 let mdd_key_scan = key_scan_start.elapsed();
69
70 let entry_scan_start = Instant::now();
71 let mut mdd_entry_count = 0usize;
72 let mut mdd_entry_key_bytes = 0usize;
73 let mut mdd_entry_data_bytes = 0usize;
74 for entry in mdd.entries() {
75 let entry = entry?;
76 mdd_entry_count += 1;
77 mdd_entry_key_bytes += entry.key.len();
78 mdd_entry_data_bytes += entry.data.len();
79 }
80 let mdd_entry_scan = entry_scan_start.elapsed();
81
82 println!("mdx_open_ms={}", mdx_open.as_millis());
83 println!("mdx_lookup_ms_total={}", mdx_lookup.as_millis());
84 println!(
85 "mdx_lookup_ms_avg={:.2}",
86 mdx_lookup.as_secs_f64() * 1000.0 / queries.len() as f64
87 );
88 println!("mdx_total_chars={total_chars}");
89 println!("mdx_keys_scan_ms_total={}", mdx_key_scan.as_millis());
90 println!("mdx_keys_scan_count={mdx_key_count}");
91 println!("mdx_keys_scan_total_bytes={mdx_key_bytes}");
92 println!("mdx_entries_scan_ms_total={}", mdx_entry_scan.as_millis());
93 println!("mdx_entries_scan_count={mdx_entry_count}");
94 println!("mdx_entries_scan_key_bytes={mdx_entry_key_bytes}");
95 println!("mdx_entries_scan_text_bytes={mdx_entry_text_bytes}");
96 println!("mdd_open_ms={}", mdd_open.as_millis());
97 println!("mdd_lookup_ms_total={}", mdd_lookup.as_millis());
98 println!("mdd_css_bytes={}", css.data.len());
99 println!("mdd_keys_scan_ms_total={}", mdd_key_scan.as_millis());
100 println!("mdd_keys_scan_count={mdd_key_count}");
101 println!("mdd_keys_scan_total_bytes={mdd_key_bytes}");
102 println!("mdd_entries_scan_ms_total={}", mdd_entry_scan.as_millis());
103 println!("mdd_entries_scan_count={mdd_entry_count}");
104 println!("mdd_entries_scan_key_bytes={mdd_entry_key_bytes}");
105 println!("mdd_entries_scan_data_bytes={mdd_entry_data_bytes}");
106
107 Ok(())
108}Sourcepub fn lookup_span(&self, key: &str) -> Result<Option<MddResourceSpan>>
pub fn lookup_span(&self, key: &str) -> Result<Option<MddResourceSpan>>
Resolves a single resource key into a lazily readable record span.
Sourcepub fn read_record_span_with<F>(
&self,
span: &MddResourceSpan,
visitor: F,
) -> Result<()>
pub fn read_record_span_with<F>( &self, span: &MddResourceSpan, visitor: F, ) -> Result<()>
Reads a resolved resource span chunk by chunk.
Sourcepub fn keys(&self) -> MddKeyIter<'_> ⓘ
pub fn keys(&self) -> MddKeyIter<'_> ⓘ
Returns a lazy iterator over decoded keys without reading resources.
Examples found in repository?
examples/bench_local.rs (line 63)
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let mut args = env::args().skip(1);
8 let mdx_path = args
9 .next()
10 .ok_or("usage: bench_local <mdx_path> <mdd_path>")?;
11 let mdd_path = args
12 .next()
13 .ok_or("usage: bench_local <mdx_path> <mdd_path>")?;
14
15 let open_start = Instant::now();
16 let mdx = MdxFile::open(&mdx_path)?;
17 let mdx_open = open_start.elapsed();
18
19 let queries = ["apple", "book", "zebra", "Apple"];
20 let lookup_start = Instant::now();
21 let mut total_chars = 0usize;
22 for query in queries {
23 let record = mdx.lookup(query)?.ok_or("missing benchmark MDX key")?;
24 total_chars += record.text.len();
25 }
26 let mdx_lookup = lookup_start.elapsed();
27
28 let key_scan_start = Instant::now();
29 let mut mdx_key_count = 0usize;
30 let mut mdx_key_bytes = 0usize;
31 for key in mdx.keys() {
32 let key = key?;
33 mdx_key_count += 1;
34 mdx_key_bytes += key.len();
35 }
36 let mdx_key_scan = key_scan_start.elapsed();
37
38 let entry_scan_start = Instant::now();
39 let mut mdx_entry_count = 0usize;
40 let mut mdx_entry_key_bytes = 0usize;
41 let mut mdx_entry_text_bytes = 0usize;
42 for entry in mdx.entries() {
43 let entry = entry?;
44 mdx_entry_count += 1;
45 mdx_entry_key_bytes += entry.key.len();
46 mdx_entry_text_bytes += entry.text.len();
47 }
48 let mdx_entry_scan = entry_scan_start.elapsed();
49
50 let open_start = Instant::now();
51 let mdd = MddFile::open(&mdd_path)?;
52 let mdd_open = open_start.elapsed();
53
54 let lookup_start = Instant::now();
55 let css = mdd
56 .lookup("\\LM5style.css")?
57 .ok_or("missing benchmark MDD key")?;
58 let mdd_lookup = lookup_start.elapsed();
59
60 let key_scan_start = Instant::now();
61 let mut mdd_key_count = 0usize;
62 let mut mdd_key_bytes = 0usize;
63 for key in mdd.keys() {
64 let key = key?;
65 mdd_key_count += 1;
66 mdd_key_bytes += key.len();
67 }
68 let mdd_key_scan = key_scan_start.elapsed();
69
70 let entry_scan_start = Instant::now();
71 let mut mdd_entry_count = 0usize;
72 let mut mdd_entry_key_bytes = 0usize;
73 let mut mdd_entry_data_bytes = 0usize;
74 for entry in mdd.entries() {
75 let entry = entry?;
76 mdd_entry_count += 1;
77 mdd_entry_key_bytes += entry.key.len();
78 mdd_entry_data_bytes += entry.data.len();
79 }
80 let mdd_entry_scan = entry_scan_start.elapsed();
81
82 println!("mdx_open_ms={}", mdx_open.as_millis());
83 println!("mdx_lookup_ms_total={}", mdx_lookup.as_millis());
84 println!(
85 "mdx_lookup_ms_avg={:.2}",
86 mdx_lookup.as_secs_f64() * 1000.0 / queries.len() as f64
87 );
88 println!("mdx_total_chars={total_chars}");
89 println!("mdx_keys_scan_ms_total={}", mdx_key_scan.as_millis());
90 println!("mdx_keys_scan_count={mdx_key_count}");
91 println!("mdx_keys_scan_total_bytes={mdx_key_bytes}");
92 println!("mdx_entries_scan_ms_total={}", mdx_entry_scan.as_millis());
93 println!("mdx_entries_scan_count={mdx_entry_count}");
94 println!("mdx_entries_scan_key_bytes={mdx_entry_key_bytes}");
95 println!("mdx_entries_scan_text_bytes={mdx_entry_text_bytes}");
96 println!("mdd_open_ms={}", mdd_open.as_millis());
97 println!("mdd_lookup_ms_total={}", mdd_lookup.as_millis());
98 println!("mdd_css_bytes={}", css.data.len());
99 println!("mdd_keys_scan_ms_total={}", mdd_key_scan.as_millis());
100 println!("mdd_keys_scan_count={mdd_key_count}");
101 println!("mdd_keys_scan_total_bytes={mdd_key_bytes}");
102 println!("mdd_entries_scan_ms_total={}", mdd_entry_scan.as_millis());
103 println!("mdd_entries_scan_count={mdd_entry_count}");
104 println!("mdd_entries_scan_key_bytes={mdd_entry_key_bytes}");
105 println!("mdd_entries_scan_data_bytes={mdd_entry_data_bytes}");
106
107 Ok(())
108}Sourcepub fn keys_with_ordinals(&self) -> MddOrdinalKeyIter<'_> ⓘ
pub fn keys_with_ordinals(&self) -> MddOrdinalKeyIter<'_> ⓘ
Returns a lazy iterator over decoded keys with stable ordinals.
Sourcepub fn key_at(&self, ordinal: KeyOrdinal) -> Result<Option<String>>
pub fn key_at(&self, ordinal: KeyOrdinal) -> Result<Option<String>>
Returns the original key at a stable ordinal without reading resources.
Sourcepub fn keys_at(&self, ordinals: &[KeyOrdinal]) -> Result<Vec<Option<String>>>
pub fn keys_at(&self, ordinals: &[KeyOrdinal]) -> Result<Vec<Option<String>>>
Returns original keys for a batch of ordinals in input order.
Sourcepub fn entries(&self) -> MddEntryIter<'_> ⓘ
pub fn entries(&self) -> MddEntryIter<'_> ⓘ
Examples found in repository?
examples/inspect.rs (line 56)
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}More examples
examples/bench_local.rs (line 74)
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let mut args = env::args().skip(1);
8 let mdx_path = args
9 .next()
10 .ok_or("usage: bench_local <mdx_path> <mdd_path>")?;
11 let mdd_path = args
12 .next()
13 .ok_or("usage: bench_local <mdx_path> <mdd_path>")?;
14
15 let open_start = Instant::now();
16 let mdx = MdxFile::open(&mdx_path)?;
17 let mdx_open = open_start.elapsed();
18
19 let queries = ["apple", "book", "zebra", "Apple"];
20 let lookup_start = Instant::now();
21 let mut total_chars = 0usize;
22 for query in queries {
23 let record = mdx.lookup(query)?.ok_or("missing benchmark MDX key")?;
24 total_chars += record.text.len();
25 }
26 let mdx_lookup = lookup_start.elapsed();
27
28 let key_scan_start = Instant::now();
29 let mut mdx_key_count = 0usize;
30 let mut mdx_key_bytes = 0usize;
31 for key in mdx.keys() {
32 let key = key?;
33 mdx_key_count += 1;
34 mdx_key_bytes += key.len();
35 }
36 let mdx_key_scan = key_scan_start.elapsed();
37
38 let entry_scan_start = Instant::now();
39 let mut mdx_entry_count = 0usize;
40 let mut mdx_entry_key_bytes = 0usize;
41 let mut mdx_entry_text_bytes = 0usize;
42 for entry in mdx.entries() {
43 let entry = entry?;
44 mdx_entry_count += 1;
45 mdx_entry_key_bytes += entry.key.len();
46 mdx_entry_text_bytes += entry.text.len();
47 }
48 let mdx_entry_scan = entry_scan_start.elapsed();
49
50 let open_start = Instant::now();
51 let mdd = MddFile::open(&mdd_path)?;
52 let mdd_open = open_start.elapsed();
53
54 let lookup_start = Instant::now();
55 let css = mdd
56 .lookup("\\LM5style.css")?
57 .ok_or("missing benchmark MDD key")?;
58 let mdd_lookup = lookup_start.elapsed();
59
60 let key_scan_start = Instant::now();
61 let mut mdd_key_count = 0usize;
62 let mut mdd_key_bytes = 0usize;
63 for key in mdd.keys() {
64 let key = key?;
65 mdd_key_count += 1;
66 mdd_key_bytes += key.len();
67 }
68 let mdd_key_scan = key_scan_start.elapsed();
69
70 let entry_scan_start = Instant::now();
71 let mut mdd_entry_count = 0usize;
72 let mut mdd_entry_key_bytes = 0usize;
73 let mut mdd_entry_data_bytes = 0usize;
74 for entry in mdd.entries() {
75 let entry = entry?;
76 mdd_entry_count += 1;
77 mdd_entry_key_bytes += entry.key.len();
78 mdd_entry_data_bytes += entry.data.len();
79 }
80 let mdd_entry_scan = entry_scan_start.elapsed();
81
82 println!("mdx_open_ms={}", mdx_open.as_millis());
83 println!("mdx_lookup_ms_total={}", mdx_lookup.as_millis());
84 println!(
85 "mdx_lookup_ms_avg={:.2}",
86 mdx_lookup.as_secs_f64() * 1000.0 / queries.len() as f64
87 );
88 println!("mdx_total_chars={total_chars}");
89 println!("mdx_keys_scan_ms_total={}", mdx_key_scan.as_millis());
90 println!("mdx_keys_scan_count={mdx_key_count}");
91 println!("mdx_keys_scan_total_bytes={mdx_key_bytes}");
92 println!("mdx_entries_scan_ms_total={}", mdx_entry_scan.as_millis());
93 println!("mdx_entries_scan_count={mdx_entry_count}");
94 println!("mdx_entries_scan_key_bytes={mdx_entry_key_bytes}");
95 println!("mdx_entries_scan_text_bytes={mdx_entry_text_bytes}");
96 println!("mdd_open_ms={}", mdd_open.as_millis());
97 println!("mdd_lookup_ms_total={}", mdd_lookup.as_millis());
98 println!("mdd_css_bytes={}", css.data.len());
99 println!("mdd_keys_scan_ms_total={}", mdd_key_scan.as_millis());
100 println!("mdd_keys_scan_count={mdd_key_count}");
101 println!("mdd_keys_scan_total_bytes={mdd_key_bytes}");
102 println!("mdd_entries_scan_ms_total={}", mdd_entry_scan.as_millis());
103 println!("mdd_entries_scan_count={mdd_entry_count}");
104 println!("mdd_entries_scan_key_bytes={mdd_entry_key_bytes}");
105 println!("mdd_entries_scan_data_bytes={mdd_entry_data_bytes}");
106
107 Ok(())
108}Trait Implementations§
Auto Trait Implementations§
impl !Freeze for MddFile
impl RefUnwindSafe for MddFile
impl Send for MddFile
impl Sync for MddFile
impl Unpin for MddFile
impl UnsafeUnpin for MddFile
impl UnwindSafe for MddFile
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more