use Lazy instead of OnceCell for MIMEDB
This commit is contained in:
parent
b368be3e6b
commit
c2e6738f6b
4 changed files with 8 additions and 29 deletions
|
@ -2,6 +2,7 @@ use std::collections::{BTreeSet, HashMap};
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::{Read, Seek, SeekFrom};
|
use std::io::{Read, Seek, SeekFrom};
|
||||||
|
use std::ops::Deref;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::sync::RwLock;
|
use std::sync::RwLock;
|
||||||
|
@ -96,7 +97,7 @@ pub fn wanted_file(
|
||||||
pub fn scan_file(entry: &DirEntry, canonical_paths: bool) -> Result<Findings, ScanError> {
|
pub fn scan_file(entry: &DirEntry, canonical_paths: bool) -> Result<Findings, ScanError> {
|
||||||
let path = entry.path();
|
let path = entry.path();
|
||||||
// try to determine mimetype for this entry
|
// try to determine mimetype for this entry
|
||||||
let result = match mime_type(MIMEDB.get().unwrap(), path) {
|
let result = match mime_type(MIMEDB.deref(), path) {
|
||||||
// an error occurred while trying to read the file
|
// an error occurred while trying to read the file
|
||||||
Err(_) => return Err(ScanError::File(path)),
|
Err(_) => return Err(ScanError::File(path)),
|
||||||
// the file was read successfully, but we were unable to determine its mimetype
|
// the file was read successfully, but we were unable to determine its mimetype
|
||||||
|
|
27
src/lib.rs
27
src/lib.rs
|
@ -9,7 +9,7 @@ pub mod parameters;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
|
||||||
use cfg_if::cfg_if;
|
use cfg_if::cfg_if;
|
||||||
use once_cell::sync::OnceCell;
|
use once_cell::sync::Lazy;
|
||||||
|
|
||||||
use crate::findings::Findings;
|
use crate::findings::Findings;
|
||||||
use crate::mime_db::MimeDb;
|
use crate::mime_db::MimeDb;
|
||||||
|
@ -26,27 +26,10 @@ cfg_if! {
|
||||||
|
|
||||||
cfg_if! {
|
cfg_if! {
|
||||||
if #[cfg(any(all(unix, feature = "infer-backend"), all(not(unix), not(feature = "xdg-mime-backend"))))] {
|
if #[cfg(any(all(unix, feature = "infer-backend"), all(not(unix), not(feature = "xdg-mime-backend"))))] {
|
||||||
/// A [OnceCell] holding an instance of [mime_db::MimeDb].
|
/// A [Lazy] holding an instance of [mime_db::MimeDb].
|
||||||
pub static MIMEDB: OnceCell<mime_db::InferDb> = OnceCell::new();
|
pub static MIMEDB: Lazy<mime_db::InferDb> = Lazy::new(|| crate::mime_db::InferDb::init());
|
||||||
} else {
|
} else {
|
||||||
/// A [OnceCell] holding an instance of [mime_db::MimeDb].
|
/// A [Lazy] holding an instance of [mime_db::MimeDb].
|
||||||
pub static MIMEDB: OnceCell<mime_db::XdgDb> = OnceCell::new();
|
pub static MIMEDB: Lazy<mime_db::XdgDb> = Lazy::new(|| crate::mime_db::XdgDb::init());
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Initialises [`MIMEDB`] with a value dependent on the current backend.
|
|
||||||
pub fn init_db() {
|
|
||||||
cfg_if! {
|
|
||||||
if #[cfg(any(all(unix, feature = "infer-backend"), all(not(unix), not(feature = "xdg-mime-backend"))))] {
|
|
||||||
MIMEDB
|
|
||||||
.set(crate::mime_db::InferDb::init())
|
|
||||||
.or(Err("Failed to initialise Infer backend!"))
|
|
||||||
.unwrap();
|
|
||||||
} else {
|
|
||||||
MIMEDB
|
|
||||||
.set(crate::mime_db::XdgDb::init())
|
|
||||||
.or(Err("Failed to initialise XDG Mime backend!"))
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ use fif::files::{scan_directory, scan_from_walkdir};
|
||||||
use fif::formats::Format;
|
use fif::formats::Format;
|
||||||
use fif::parameters::OutputFormat;
|
use fif::parameters::OutputFormat;
|
||||||
use fif::utils::{clap_long_version, os_name};
|
use fif::utils::{clap_long_version, os_name};
|
||||||
use fif::{formats, init_db, parameters};
|
use fif::{formats, parameters};
|
||||||
use log::{debug, error, info, trace, warn, Level};
|
use log::{debug, error, info, trace, warn, Level};
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -58,8 +58,6 @@ fn main() {
|
||||||
std::env::consts::ARCH,
|
std::env::consts::ARCH,
|
||||||
os_name()
|
os_name()
|
||||||
);
|
);
|
||||||
trace!("Initialising mimetype database");
|
|
||||||
init_db();
|
|
||||||
|
|
||||||
debug!("Iterating directory: {:?}", args.dir);
|
debug!("Iterating directory: {:?}", args.dir);
|
||||||
|
|
||||||
|
|
|
@ -128,9 +128,6 @@ fn simple_directory() {
|
||||||
// there should be one file missing: "ignore.fake_ext"
|
// there should be one file missing: "ignore.fake_ext"
|
||||||
assert_eq!(entries.len(), files.len() - 1);
|
assert_eq!(entries.len(), files.len() - 1);
|
||||||
|
|
||||||
// initialise global mime DB - this is needed because `scan_from_walkdir` expects it to be present.
|
|
||||||
crate::init_db();
|
|
||||||
|
|
||||||
let results = scan_from_walkdir(&entries, false);
|
let results = scan_from_walkdir(&entries, false);
|
||||||
let canonical_results = scan_from_walkdir(&entries, true);
|
let canonical_results = scan_from_walkdir(&entries, true);
|
||||||
assert_eq!(results.len(), canonical_results.len());
|
assert_eq!(results.len(), canonical_results.len());
|
||||||
|
|
Loading…
Reference in a new issue