use std::io::Read;
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_kind::MediaStreamClassifierKind;
#[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> {
MediaStreamClassifierKind::from_name(name).map(Self::from_kind)
}
pub fn from_config(config: &MimeConfig) -> Self {
let backend = MediaStreamClassifierKind::select(config.media_stream_classifier_default());
Self::from_kind(backend)
}
pub fn into_inner(self) -> Arc<dyn MediaStreamClassifier> {
self.inner
}
fn from_kind(kind: MediaStreamClassifierKind) -> Self {
match kind {
MediaStreamClassifierKind::FfprobeCommand => {
Self::new(Arc::new(FfprobeCommandMediaStreamClassifier::new()))
}
}
}
}
impl Default for ArcMediaStreamClassifier {
fn default() -> Self {
Self::from_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_reader(&self, reader: &mut dyn Read) -> MimeResult<MediaStreamType> {
self.inner.classify_reader(reader)
}
}