1use jsonschema::ValidationError;
2use serde_json::Value;
3use std::{borrow::Cow, sync::Arc};
4use thiserror::Error;
5use url::Url;
6
7#[derive(Debug, Error)]
9#[non_exhaustive]
10pub enum Error {
11 #[error("value is not an object or an array, cannot validate")]
13 CannotValidate(Value),
14
15 #[error(transparent)]
17 Io(#[from] std::io::Error),
18
19 #[error("no type field")]
21 NoType,
22
23 #[error("no version field")]
25 NoVersion,
26
27 #[error(transparent)]
29 Reqwest(#[from] reqwest::Error),
30
31 #[error(transparent)]
33 SerdeJson(#[from] serde_json::Error),
34
35 #[error(transparent)]
37 Stac(#[from] stac::Error),
38
39 #[error(transparent)]
41 TokioJoin(#[from] tokio::task::JoinError),
42
43 #[error(transparent)]
45 TokioSend(
46 #[from]
47 tokio::sync::mpsc::error::SendError<(
48 Url,
49 tokio::sync::oneshot::Sender<crate::Result<Arc<Value>>>,
50 )>,
51 ),
52
53 #[error(transparent)]
55 TokioRecv(#[from] tokio::sync::oneshot::error::RecvError),
56
57 #[error(transparent)]
59 UrlParse(#[from] url::ParseError),
60
61 #[error("validation errors")]
67 Validation(Vec<ValidationError<'static>>),
68}
69
70impl Error {
71 pub fn from_validation_errors<'a, I>(errors: I) -> Error
73 where
74 I: Iterator<Item = ValidationError<'a>>,
75 {
76 let mut error_vec = Vec::new();
77 for error in errors {
78 error_vec.push(ValidationError {
80 instance_path: error.instance_path.clone(),
81 instance: Cow::Owned(error.instance.into_owned()),
82 kind: error.kind,
83 schema_path: error.schema_path,
84 })
85 }
86 Error::Validation(error_vec)
87 }
88}