shared_mime/mimedb/
build.rs1use log::*;
2
3use super::{GlobRule, MimeDB};
4#[cfg(feature = "xdg-runtime")]
5use crate::runtime::mimeinfo::SharedMimeInfo;
6use crate::{fnmatch::FileMatcher, record::MimeTypeRecord};
7
8impl MimeDB {
9 pub fn add_records(&mut self, records: Vec<MimeTypeRecord>) {
10 self.sequence += 1;
11 for rec in records {
12 let name = self.names.cache(&rec.name);
13 let info = self.type_info.entry(name).or_default();
14 if let Some(desc) = rec.description {
15 info.description = Some(desc);
16 }
17 info.aliases
18 .extend(rec.aliases.into_iter().map(|c| self.names.cache(c)));
19 info.parents
20 .extend(rec.superclasses.into_iter().map(|c| self.names.cache(c)));
21 for glob in rec.globs {
22 let mut matcher = FileMatcher::new(glob.pattern);
23 if glob.case_sensitive {
24 matcher = matcher.case_sensitive();
25 }
26 self.globs.push(GlobRule {
27 matcher,
28 sequence: self.sequence,
29 weight: glob.weight,
30 mimetype: rec.name.clone(),
31 })
32 }
33 }
34 self.globs.sort_by(|a, b| {
35 let seq = a.sequence.cmp(&b.sequence).reverse();
37 let weight = a.weight.cmp(&b.weight).reverse();
39 seq.then(weight)
40 });
41 }
42
43 #[cfg(feature = "xdg-runtime")]
44 pub fn add_shared_mime_info(&mut self, info: SharedMimeInfo) {
45 for dir in info.directories {
46 debug!("adding MIME info from {}", dir.path.display());
47 for pkg in dir.packages {
48 self.add_records(pkg.types);
49 }
50 }
51 }
52}