stac_validate/
error.rs

1use jsonschema::ValidationError;
2use serde_json::Value;
3use std::{borrow::Cow, sync::Arc};
4use thiserror::Error;
5use url::Url;
6
7/// Crate-specific error type.
8#[derive(Debug, Error)]
9#[non_exhaustive]
10pub enum Error {
11    /// Cannot validate a non-object, non-array
12    #[error("value is not an object or an array, cannot validate")]
13    CannotValidate(Value),
14
15    /// [std::io::Error]
16    #[error(transparent)]
17    Io(#[from] std::io::Error),
18
19    /// No type field on an object.
20    #[error("no type field")]
21    NoType,
22
23    /// No version field on an object.
24    #[error("no version field")]
25    NoVersion,
26
27    /// [reqwest::Error]
28    #[error(transparent)]
29    Reqwest(#[from] reqwest::Error),
30
31    /// [serde_json::Error]
32    #[error(transparent)]
33    SerdeJson(#[from] serde_json::Error),
34
35    /// [stac::Error]
36    #[error(transparent)]
37    Stac(#[from] stac::Error),
38
39    /// [tokio::task::JoinError]
40    #[error(transparent)]
41    TokioJoin(#[from] tokio::task::JoinError),
42
43    /// [tokio::sync::mpsc::error::SendError]
44    #[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    /// [tokio::sync::oneshot::error::RecvError]
54    #[error(transparent)]
55    TokioRecv(#[from] tokio::sync::oneshot::error::RecvError),
56
57    /// [url::ParseError]
58    #[error(transparent)]
59    UrlParse(#[from] url::ParseError),
60
61    /// A list of validation errors.
62    ///
63    /// Since we usually don't have the original [serde_json::Value] (because we
64    /// create them from the STAC objects), we need these errors to be `'static`
65    /// lifetime.
66    #[error("validation errors")]
67    Validation(Vec<ValidationError<'static>>),
68}
69
70impl Error {
71    /// Creates an [crate::Error] from an iterator over [jsonschema::ValidationError].
72    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            // Cribbed from https://docs.rs/jsonschema/latest/src/jsonschema/error.rs.html#21-30
79            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}