use std::ops::Deref;
use std::path::Path;
use qubit_io::ReadSeek;
use crate::{
MimeConfig,
MimeDetectionPolicy,
MimeDetector,
MimeResult,
};
use super::MimeDetectorRegistry;
#[derive(Debug)]
pub struct BoxMimeDetector {
inner: Box<dyn MimeDetector>,
}
impl BoxMimeDetector {
pub fn new(detector: Box<dyn MimeDetector>) -> Self {
Self { inner: detector }
}
pub fn from_name(name: &str) -> MimeResult<Self> {
Self::from_name_with_config(name, &MimeConfig::default())
}
pub fn from_name_with_config(name: &str, config: &MimeConfig) -> MimeResult<Self> {
MimeDetectorRegistry::default_registry()?.create(name, config)
}
pub fn from_registry_name(
registry: &MimeDetectorRegistry,
name: &str,
config: &MimeConfig,
) -> MimeResult<Self> {
registry.create(name, config)
}
pub fn from_config(config: &MimeConfig) -> MimeResult<Self> {
Self::from_registry(&MimeDetectorRegistry::default_registry()?, config)
}
pub fn from_registry(registry: &MimeDetectorRegistry, config: &MimeConfig) -> MimeResult<Self> {
registry.create_default(config)
}
pub fn into_inner(self) -> Box<dyn MimeDetector> {
self.inner
}
}
impl Deref for BoxMimeDetector {
type Target = dyn MimeDetector;
fn deref(&self) -> &Self::Target {
self.as_ref()
}
}
impl AsRef<dyn MimeDetector> for BoxMimeDetector {
fn as_ref(&self) -> &(dyn MimeDetector + 'static) {
self.inner.as_ref()
}
}
impl From<Box<dyn MimeDetector>> for BoxMimeDetector {
fn from(detector: Box<dyn MimeDetector>) -> Self {
Self::new(detector)
}
}
impl From<BoxMimeDetector> for Box<dyn MimeDetector> {
fn from(detector: BoxMimeDetector) -> Self {
detector.into_inner()
}
}
impl MimeDetector for BoxMimeDetector {
fn detect_by_filename(&self, filename: &str) -> Option<String> {
self.inner.detect_by_filename(filename)
}
fn detect_by_content(&self, content: &[u8]) -> Option<String> {
self.inner.detect_by_content(content)
}
fn detect(
&self,
content: &[u8],
filename: Option<&str>,
policy: MimeDetectionPolicy,
) -> Option<String> {
self.inner.detect(content, filename, policy)
}
fn detect_reader(
&self,
reader: &mut dyn ReadSeek,
filename: Option<&str>,
policy: MimeDetectionPolicy,
) -> MimeResult<Option<String>> {
self.inner.detect_reader(reader, filename, policy)
}
fn detect_file(&self, file: &Path, policy: MimeDetectionPolicy) -> MimeResult<Option<String>> {
self.inner.detect_file(file, policy)
}
}