use thiserror::Error;
#[derive(Error, Debug)]
pub enum CjError {
#[error("IO error during CityJSON operation: {0}")]
Io(#[from] std::io::Error),
#[error("Invalid CityJSON: {source}")]
CityJSON {
#[from]
source: serde_json::Error,
},
#[error("Missing required field: {field}")]
MissingField { field: String },
#[error("Invalid CityJSON version: {version}")]
InvalidVersion { version: String },
#[error("Invalid CityObject type: {type_}")]
InvalidObjectType { type_: String },
#[error("Invalid geometry: {msg}")]
InvalidGeometry { msg: String },
#[error("Invalid semantic surface: {msg}")]
InvalidSemantics { msg: String },
}
impl CjError {
pub fn missing_field(field: impl Into<String>) -> Self {
Self::MissingField {
field: field.into(),
}
}
pub fn invalid_version(version: impl Into<String>) -> Self {
Self::InvalidVersion {
version: version.into(),
}
}
pub fn invalid_object_type(type_: impl Into<String>) -> Self {
Self::InvalidObjectType {
type_: type_.into(),
}
}
pub fn invalid_geometry(msg: impl Into<String>) -> Self {
Self::InvalidGeometry { msg: msg.into() }
}
pub fn invalid_semantics(msg: impl Into<String>) -> Self {
Self::InvalidSemantics { msg: msg.into() }
}
pub fn is_field_error(&self) -> bool {
matches!(self, CjError::MissingField { .. })
}
pub fn is_validation_error(&self) -> bool {
matches!(
self,
CjError::InvalidVersion { .. }
| CjError::InvalidObjectType { .. }
| CjError::InvalidGeometry { .. }
| CjError::InvalidSemantics { .. }
)
}
}