use std::ops::Deref;
use std::path::Path;
use std::sync::Arc;
use qubit_io::ReadSeek;
use crate::{
BoxMimeDetector,
MimeConfig,
MimeDetectionPolicy,
MimeDetector,
MimeResult,
};
use super::MimeDetectorRegistry;
#[derive(Debug, Clone)]
pub struct ArcMimeDetector {
inner: Arc<dyn MimeDetector>,
}
impl ArcMimeDetector {
pub fn new(detector: Arc<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> {
BoxMimeDetector::from_name_with_config(name, config).map(Self::from_box)
}
pub fn from_registry_name(
registry: &MimeDetectorRegistry,
name: &str,
config: &MimeConfig,
) -> MimeResult<Self> {
BoxMimeDetector::from_registry_name(registry, name, config).map(Self::from_box)
}
pub fn from_config(config: &MimeConfig) -> MimeResult<Self> {
BoxMimeDetector::from_config(config).map(Self::from_box)
}
pub fn from_registry(registry: &MimeDetectorRegistry, config: &MimeConfig) -> MimeResult<Self> {
BoxMimeDetector::from_registry(registry, config).map(Self::from_box)
}
fn from_box(detector: BoxMimeDetector) -> Self {
let boxed = detector.into_inner();
Self::new(Arc::from(boxed))
}
pub fn into_inner(self) -> Arc<dyn MimeDetector> {
self.inner
}
}
impl Deref for ArcMimeDetector {
type Target = dyn MimeDetector;
fn deref(&self) -> &Self::Target {
self.as_ref()
}
}
impl AsRef<dyn MimeDetector> for ArcMimeDetector {
fn as_ref(&self) -> &(dyn MimeDetector + 'static) {
self.inner.as_ref()
}
}
impl From<Arc<dyn MimeDetector>> for ArcMimeDetector {
fn from(detector: Arc<dyn MimeDetector>) -> Self {
Self::new(detector)
}
}
impl From<ArcMimeDetector> for Arc<dyn MimeDetector> {
fn from(detector: ArcMimeDetector) -> Self {
detector.into_inner()
}
}
impl MimeDetector for ArcMimeDetector {
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)
}
}