use std::fmt;
pub mod slice_summary;
#[cfg(feature = "bambu-3mf")]
pub mod bambu_3mf;
#[cfg(feature = "gcode")]
pub mod gcode;
#[cfg(feature = "prusa-sl1")]
pub mod prusa_sl1;
#[cfg(feature = "prusa-bgcode")]
pub mod prusa_bgcode;
#[cfg(any(feature = "gcode", feature = "prusa-bgcode"))]
mod gcode_metadata;
#[cfg(any(feature = "bambu-3mf", feature = "prusa-sl1"))]
mod zip_read;
use slice_summary::SliceSummary;
#[derive(Debug)]
#[non_exhaustive]
pub enum ParseError {
Io(std::io::Error),
#[cfg(any(feature = "bambu-3mf", feature = "prusa-sl1"))]
Zip(String),
NotThisFormat,
MissingField(&'static str),
InvalidField(&'static str, String),
}
impl fmt::Display for ParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ParseError::Io(e) => write!(f, "io error: {e}"),
#[cfg(any(feature = "bambu-3mf", feature = "prusa-sl1"))]
ParseError::Zip(e) => write!(f, "zip error: {e}"),
ParseError::NotThisFormat => write!(f, "not this parser's format"),
ParseError::MissingField(name) => write!(f, "missing field: {name}"),
ParseError::InvalidField(name, value) => {
write!(f, "invalid value for field {name}: {value:?}")
}
}
}
}
impl std::error::Error for ParseError {}
impl From<std::io::Error> for ParseError {
fn from(e: std::io::Error) -> Self {
ParseError::Io(e)
}
}
pub trait SliceParser {
fn detect(bytes: &[u8], filename: &str) -> bool;
fn parse(bytes: &[u8]) -> Result<SliceSummary, ParseError>;
}
pub fn parse_slice_bytes(bytes: &[u8], filename: &str) -> Result<SliceSummary, ParseError> {
#[cfg(feature = "bambu-3mf")]
if bambu_3mf::Bambu3mf::detect(bytes, filename) {
return bambu_3mf::Bambu3mf::parse(bytes);
}
#[cfg(feature = "prusa-sl1")]
if prusa_sl1::PrusaSl1::detect(bytes, filename) {
return prusa_sl1::PrusaSl1::parse(bytes);
}
#[cfg(feature = "prusa-bgcode")]
if prusa_bgcode::PrusaBgcode::detect(bytes, filename) {
return prusa_bgcode::PrusaBgcode::parse(bytes);
}
#[cfg(feature = "gcode")]
if gcode::Gcode::detect(bytes, filename) {
return gcode::Gcode::parse(bytes);
}
let _ = (bytes, filename);
Err(ParseError::NotThisFormat)
}