mod act;
pub mod asm_header;
pub mod brep;
pub mod container;
pub mod decode;
pub mod design;
pub mod history;
pub mod materials;
pub mod nurbs;
pub mod sab;
use cadmpeg_ir::codec::{
Codec, CodecError, Confidence, ContainerSummary, DecodeOptions, DecodeResult, ReadSeek,
};
const ZIP_MAGIC: &[u8] = b"PK\x03\x04";
#[derive(Debug, Default, Clone, Copy)]
pub struct F3dCodec;
impl Codec for F3dCodec {
fn id(&self) -> &'static str {
"f3d"
}
fn detect(&self, prefix: &[u8]) -> Confidence {
if !prefix.starts_with(ZIP_MAGIC) {
return Confidence::No;
}
if container::DETECT_MARKERS
.iter()
.any(|m| contains_subslice(prefix, m))
{
Confidence::High
} else {
Confidence::Low
}
}
fn inspect(&self, reader: &mut dyn ReadSeek) -> Result<ContainerSummary, CodecError> {
let scan = container::scan(reader)?;
Ok(container::summarize(&scan))
}
fn decode(
&self,
reader: &mut dyn ReadSeek,
options: &DecodeOptions,
) -> Result<DecodeResult, CodecError> {
decode::decode(reader, options)
}
}
fn contains_subslice(haystack: &[u8], needle: &[u8]) -> bool {
if needle.is_empty() || haystack.len() < needle.len() {
return false;
}
haystack.windows(needle.len()).any(|w| w == needle)
}
#[cfg(test)]
mod tests;