use std::ops::Deref;
use std::path::Path;
use std::sync::Arc;
use crate::{MediaStreamClassifier, MediaStreamType, MimeConfig, MimeResult};
use super::FfprobeCommandMediaStreamClassifier;
use super::media_stream_classifier_backend::MediaStreamClassifierBackend;
#[derive(Debug, Clone)]
pub struct ArcMediaStreamClassifier {
inner: Arc<dyn MediaStreamClassifier>,
}
impl ArcMediaStreamClassifier {
pub fn new(classifier: Arc<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) -> Arc<dyn MediaStreamClassifier> {
self.inner
}
fn from_backend(backend: MediaStreamClassifierBackend) -> Self {
match backend {
MediaStreamClassifierBackend::FfprobeCommand => {
Self::new(Arc::new(FfprobeCommandMediaStreamClassifier::new()))
}
}
}
}
impl Default for ArcMediaStreamClassifier {
fn default() -> Self {
Self::from_mime_config(&MimeConfig::default())
}
}
impl Deref for ArcMediaStreamClassifier {
type Target = dyn MediaStreamClassifier;
fn deref(&self) -> &Self::Target {
self.as_ref()
}
}
impl AsRef<dyn MediaStreamClassifier> for ArcMediaStreamClassifier {
fn as_ref(&self) -> &(dyn MediaStreamClassifier + 'static) {
self.inner.as_ref()
}
}
impl From<Arc<dyn MediaStreamClassifier>> for ArcMediaStreamClassifier {
fn from(classifier: Arc<dyn MediaStreamClassifier>) -> Self {
Self::new(classifier)
}
}
impl From<ArcMediaStreamClassifier> for Arc<dyn MediaStreamClassifier> {
fn from(classifier: ArcMediaStreamClassifier) -> Self {
classifier.into_inner()
}
}
impl MediaStreamClassifier for ArcMediaStreamClassifier {
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)
}
}