#[derive(Debug, thiserror::Error)]
pub enum MapperError {
#[error("Data directory not found: {path}")]
DataDirNotFound { path: String },
#[error("No data bundle found for format version {fv}")]
BundleNotFound { fv: String },
#[error("No variant '{variant}' in bundle for {fv}")]
VariantNotFound { fv: String, variant: String },
#[error("No mapping engine for PID {pid} in {fv}/{variant}")]
PidNotFound {
fv: String,
variant: String,
pid: String,
},
#[error("Assembly error: {0}")]
Assembly(#[from] mig_assembly::AssemblyError),
#[error("Mapping error: {0}")]
Mapping(#[from] mig_bo4e::MappingError),
#[error("Serialization error: {0}")]
Serialization(String),
#[error("No MIG schema for {fv}/{variant}")]
NoMigSchema { fv: String, variant: String },
#[error(transparent)]
MissingGroupEntrySegment(Box<GroupEntrySegmentError>),
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
}
#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
#[error(
"Cannot render PID {pid}: group {group_path} ({source_path}) would contain {present_segments:?} but not its entry segment '{entry_segment}'{}",
entry_segment_hint(.entities, .entry_fields)
)]
pub struct GroupEntrySegmentError {
pub pid: String,
pub group_path: String,
pub source_path: String,
pub entry_segment: String,
pub present_segments: Vec<String>,
pub entities: Vec<String>,
pub entry_fields: Vec<String>,
}
fn entry_segment_hint(entities: &[String], entry_fields: &[String]) -> String {
if !entry_fields.is_empty() {
format!(" (set {})", entry_fields.join(" or "))
} else if !entities.is_empty() {
format!(" (entity {})", entities.join(", "))
} else {
String::new()
}
}