use std::path::PathBuf;
use duckdb::Error as DuckdbError;
use martin_core::tiles::duckdb::DuckDBError;
pub type BoundsResult<T> = Result<T, BoundsError>;
pub type GeoparquetResult<T> = Result<T, GeoparquetError>;
#[derive(thiserror::Error, Debug)]
pub enum BoundsError {
#[error("Error computing DuckDB bounds for '{1}' ({2}): {3} {0}")]
Query(#[source] Box<DuckdbError>, String, String, String),
#[error(transparent)]
Pool(#[from] DuckDBError),
}
#[derive(thiserror::Error, Debug)]
pub enum GeoparquetError {
#[error("GeoParquet source has no geometry column")]
NoGeometryColumn,
#[error(
"GeoParquet source has multiple geometry columns ({0:?}); set geometry_column explicitly"
)]
AmbiguousGeometryColumn(Vec<String>),
#[error("GeoParquet geometry column '{0}' was not found")]
GeometryColumnNotFound(String),
#[error("GeoParquet column '{0}' is not a geometry column (type {1})")]
NotGeometryColumn(String, String),
#[error("GeoParquet id_column '{0}' was not found")]
IdColumnNotFound(String),
#[error("GeoParquet path is not valid UTF-8: {0:?}")]
NonUtf8Path(PathBuf),
#[error("Unable to determine SRID for GeoParquet geometry column '{0}'")]
SridUnknown(String),
#[error("GeoParquet geometry column '{0}' has an empty CRS string")]
SridEmpty(String, String),
#[error("GeoParquet geometry column '{0}' uses unsupported CRS '{1}'")]
SridUnsupportedCrs(String, String),
#[error("GeoParquet geometry column '{0}' has invalid EPSG code in CRS '{1}'")]
SridInvalidEpsgCode(String, String),
#[error("GeoParquet geometry column '{0}' has non-positive EPSG code {2} in CRS '{1}'")]
SridNonPositive(String, String, i32),
#[error("Error introspecting GeoParquet source '{1}' ({2}): {3} {0}")]
IntrospectionQuery(String, String, String, String),
#[error(transparent)]
Bounds(#[from] BoundsError),
#[error(transparent)]
Pool(#[from] DuckDBError),
}
impl GeoparquetError {
pub(crate) fn introspection_query(
source: DuckdbError,
source_label: String,
signature: &'static str,
query: String,
) -> Self {
Self::IntrospectionQuery(
source.to_string(),
source_label,
signature.to_string(),
query,
)
}
}