use cadmpeg_ir::report::DecodeReport;
use cadmpeg_ir::unknown::UnknownRecord;
use cadmpeg_ir::{Annotations, CadIr};
use crate::container::ContainerScan;
use crate::variant::Variant;
pub mod a5a8;
pub mod b2;
pub mod b5;
pub mod consolidated;
pub mod e5;
pub mod freeform;
pub mod standard;
pub mod zero_entity;
pub(crate) struct FamilyOutput {
pub(crate) ir: CadIr,
pub(crate) report: DecodeReport,
pub(crate) annotations: Annotations,
pub(crate) unknowns: Vec<UnknownRecord>,
}
pub(crate) struct Route {
pub(crate) applicable: fn(Variant) -> bool,
pub(crate) decode: fn(&ContainerScan) -> Option<FamilyOutput>,
}
pub(crate) const ROUTES: &[Route] = &[
Route {
applicable: |v| matches!(v, Variant::StandardNested | Variant::FbbOnly),
decode: standard::decode::try_decode_standard,
},
Route {
applicable: |v| v == Variant::ZeroEntity,
decode: zero_entity::decode::try_decode_zero_entity,
},
Route {
applicable: |v| v == Variant::E5Stream,
decode: e5::decode::try_decode_e5,
},
Route {
applicable: |v| {
matches!(
v,
Variant::FloatPackedInnerNoFbb | Variant::FbbOnly | Variant::InnerNoDirectory
)
},
decode: freeform::try_decode_freeform_surfaces,
},
];