shared_mime/mimedb/
build.rs

1use 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            // higher sequences (later packages) go first
36            let seq = a.sequence.cmp(&b.sequence).reverse();
37            // higher weights go first
38            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}