use cadmpeg_codec_catia::CatiaCodec;
use cadmpeg_codec_creo::CreoCodec;
use cadmpeg_codec_f3d::F3dCodec;
use cadmpeg_codec_nx::NxCodec;
use cadmpeg_codec_sldprt::SldprtCodec;
use cadmpeg_ir::codec::{Codec, Confidence};
pub struct Registry {
codecs: Vec<Box<dyn Codec>>,
}
impl Registry {
pub fn with_builtins() -> Self {
Registry {
codecs: vec![
Box::new(F3dCodec),
Box::new(SldprtCodec),
Box::new(CatiaCodec),
Box::new(CreoCodec),
Box::new(NxCodec),
],
}
}
pub fn detect<'a>(&'a self, prefix: &[u8]) -> Option<(&'a dyn Codec, Confidence)> {
self.codecs
.iter()
.map(|c| (c.as_ref(), c.detect(prefix)))
.filter(|(_, conf)| *conf > Confidence::No)
.max_by_key(|(_, conf)| *conf)
}
pub fn by_id(&self, id: &str) -> Option<&dyn Codec> {
self.codecs
.iter()
.find(|codec| codec.id() == id)
.map(Box::as_ref)
}
}