use std::io;
use thiserror::Error;
pub type Result<T> = std::result::Result<T, CityJsonStacError>;
#[derive(Error, Debug)]
pub enum CityJsonStacError {
#[error("Unsupported file format: {0}\nSupported formats: .json (CityJSON), .jsonl (CityJSONSeq), .gml (CityGML), .fcb (FlatCityBuf)")]
UnsupportedFormat(String),
#[error("IO error: {0}")]
IoError(#[from] io::Error),
#[error("JSON parsing error: {0}")]
JsonError(#[from] serde_json::Error),
#[error("Failed to extract metadata: {0}\nThe file may be corrupted or invalid")]
MetadataError(String),
#[error("Invalid CityJSON structure: {0}")]
InvalidCityJson(String),
#[error("Missing required field: {0}")]
MissingField(String),
#[error("STAC generation error: {0}")]
StacError(String),
#[error("Invalid URL: {0}")]
UrlError(#[from] url::ParseError),
#[error("GeoJSON error: {0}")]
GeoJsonError(String),
#[error("No supported files found in directory")]
NoFilesFound,
#[error("Object storage error: {0}")]
ObjectStoreError(#[from] object_store::Error),
#[error("Path error: {0}")]
PathError(#[from] object_store::path::Error),
#[error("Storage/network error: {0}")]
StorageError(String),
#[error("{0}")]
Other(String),
}
impl From<String> for CityJsonStacError {
fn from(s: String) -> Self {
CityJsonStacError::Other(s)
}
}
impl From<&str> for CityJsonStacError {
fn from(s: &str) -> Self {
CityJsonStacError::Other(s.to_string())
}
}
impl From<zip::result::ZipError> for CityJsonStacError {
fn from(e: zip::result::ZipError) -> Self {
CityJsonStacError::InvalidCityJson(format!("ZIP archive error: {e}"))
}
}