use std::ops::Deref;
use std::path::Path;
use crate::{MediaStreamClassifier, MediaStreamType, MimeConfig, MimeResult};
use super::FfprobeCommandMediaStreamClassifier;
use super::media_stream_classifier_backend::MediaStreamClassifierBackend;
#[derive(Debug)]
pub struct BoxMediaStreamClassifier {
inner: Box<dyn MediaStreamClassifier>,
}
impl BoxMediaStreamClassifier {
pub fn new(classifier: Box<dyn MediaStreamClassifier>) -> Self {
Self { inner: classifier }
}
pub fn from_name(name: &str) -> Option<Self> {
MediaStreamClassifierBackend::from_name(name).map(Self::from_backend)
}
pub fn from_mime_config(config: &MimeConfig) -> Self {
let backend =
MediaStreamClassifierBackend::select(config.media_stream_classifier_default());
Self::from_backend(backend)
}
pub fn into_inner(self) -> Box<dyn MediaStreamClassifier> {
self.inner
}
fn from_backend(backend: MediaStreamClassifierBackend) -> Self {
match backend {
MediaStreamClassifierBackend::FfprobeCommand => {
Self::new(Box::new(FfprobeCommandMediaStreamClassifier::new()))
}
}
}
}
impl Default for BoxMediaStreamClassifier {
fn default() -> Self {
Self::from_mime_config(&MimeConfig::default())
}
}
impl Deref for BoxMediaStreamClassifier {
type Target = dyn MediaStreamClassifier;
fn deref(&self) -> &Self::Target {
self.as_ref()
}
}
impl AsRef<dyn MediaStreamClassifier> for BoxMediaStreamClassifier {
fn as_ref(&self) -> &(dyn MediaStreamClassifier + 'static) {
self.inner.as_ref()
}
}
impl From<Box<dyn MediaStreamClassifier>> for BoxMediaStreamClassifier {
fn from(classifier: Box<dyn MediaStreamClassifier>) -> Self {
Self::new(classifier)
}
}
impl From<BoxMediaStreamClassifier> for Box<dyn MediaStreamClassifier> {
fn from(classifier: BoxMediaStreamClassifier) -> Self {
classifier.into_inner()
}
}
impl MediaStreamClassifier for BoxMediaStreamClassifier {
fn classify_file(&self, file: &Path) -> MimeResult<MediaStreamType> {
self.inner.classify_file(file)
}
fn classify_content(&self, content: &[u8]) -> MimeResult<MediaStreamType> {
self.inner.classify_content(content)
}
}