use jsonschema::ValidationError;
use std::borrow::Cow;
use thiserror::Error;
use url::Url;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum Error {
#[error("cannot resolve json-schema scheme: {0}")]
CannotResolveJsonSchemaScheme(Url),
#[error("missing stac_version attribute")]
MissingStacVersion,
#[error("incorrect stac extensions type")]
IncorrectStacExtensionsType(serde_json::Value),
#[error("invalid file path: {0}")]
InvalidFilePath(Url),
#[error("invalid url scheme: {0}")]
InvalidUrlScheme(Url),
#[error("invalid json-schema at url: {0}")]
InvalidSchema(String),
#[error(transparent)]
Reqwest(#[from] reqwest::Error),
#[error(transparent)]
SerdeJson(#[from] serde_json::Error),
#[error(transparent)]
Stac(#[from] stac::Error),
#[error("validation errors")]
Validation(Vec<ValidationError<'static>>),
#[error(transparent)]
JSONSchemaValidation(#[from] ValidationError<'static>),
}
impl Error {
#[allow(single_use_lifetimes)]
pub fn from_validation_errors<'a>(errors: impl Iterator<Item = ValidationError<'a>>) -> Error {
let mut error_vec = Vec::new();
for error in errors {
error_vec.push(ValidationError {
instance_path: error.instance_path.clone(),
instance: Cow::Owned(error.instance.into_owned()),
kind: error.kind,
schema_path: error.schema_path,
})
}
Error::Validation(error_vec)
}
pub fn from_validation_error(error: ValidationError<'_>) -> Error {
Error::JSONSchemaValidation(ValidationError {
instance_path: error.instance_path.clone(),
instance: Cow::Owned(error.instance.into_owned()),
kind: error.kind,
schema_path: error.schema_path,
})
}
}