use cadmpeg_codec_catia::CatiaCodec;
use cadmpeg_codec_creo::CreoCodec;
use cadmpeg_codec_f3d::F3dCodec;
use cadmpeg_codec_nx::NxCodec;
use cadmpeg_codec_rhino::RhinoCodec;
use cadmpeg_codec_sldprt::SldprtCodec;
use cadmpeg_ir::codec::{CadirEncoder, Codec, Confidence, Encoder};
use cadmpeg_step::StepCodec;
pub struct Registry {
codecs: Vec<Box<dyn Codec>>,
encoders: Vec<Box<dyn Encoder>>,
}
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),
Box::new(RhinoCodec),
],
encoders: vec![
Box::new(F3dCodec),
Box::new(SldprtCodec),
Box::new(StepCodec::default()),
Box::new(CadirEncoder),
],
}
}
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)
}
pub fn encoder_by_id(&self, id: &str) -> Option<&dyn Encoder> {
self.encoders
.iter()
.find(|encoder| encoder.id() == id)
.map(Box::as_ref)
}
}
#[cfg(test)]
mod tests {
use super::Registry;
use crate::Format;
#[test]
fn every_exportable_format_has_an_encoder() {
let registry = Registry::with_builtins();
for format in [Format::Cadir, Format::Step, Format::F3d, Format::Sldprt] {
assert!(
registry.encoder_by_id(format.name()).is_some(),
"{}",
format.name()
);
}
}
}