Skip to main content

radicle_protocol/worker/fetch/
error.rs

1use std::io;
2
3use thiserror::Error;
4
5use radicle::{cob, identity, storage};
6use radicle_fetch as fetch;
7
8#[derive(Debug, Error)]
9pub enum Fetch {
10    #[error(transparent)]
11    Run(#[from] fetch::Error),
12    #[error(transparent)]
13    Git(#[from] radicle::git::raw::Error),
14    #[error(transparent)]
15    Storage(#[from] storage::Error),
16    #[error(transparent)]
17    StorageCopy(#[from] io::Error),
18    #[error(transparent)]
19    Repository(#[from] radicle::storage::RepositoryError),
20    #[error(transparent)]
21    RefsDb(Box<radicle::node::refs::Error>),
22    #[error(
23        "validation of the storage repository failed: the delegates {delegates:?} failed to validate to meet a threshold of {threshold}"
24    )]
25    Validation {
26        threshold: usize,
27        delegates: Vec<String>,
28    },
29    #[error(transparent)]
30    Cache(#[from] Cache),
31}
32
33impl From<radicle::node::refs::Error> for Fetch {
34    fn from(err: radicle::node::refs::Error) -> Self {
35        Self::RefsDb(Box::new(err))
36    }
37}
38
39#[derive(Debug, Error)]
40pub enum Cache {
41    #[error(transparent)]
42    Parse(#[from] cob::ParseIdentifierError),
43    #[error(transparent)]
44    Repository(#[from] storage::RepositoryError),
45    #[error("failed to remove {type_name} '{id}' from cache: {err}")]
46    Remove {
47        id: cob::ObjectId,
48        type_name: cob::TypeName,
49        #[source]
50        err: Box<dyn std::error::Error + Send + Sync + 'static>,
51    },
52    #[error(transparent)]
53    Store(#[from] cob::store::Error),
54    #[error("failed to update {type_name} '{id}' in cache: {err}")]
55    Update {
56        id: cob::ObjectId,
57        type_name: cob::TypeName,
58        #[source]
59        err: Box<dyn std::error::Error + Send + Sync + 'static>,
60    },
61}
62
63#[derive(Debug, Error)]
64pub enum Handle {
65    #[error(transparent)]
66    Doc(#[from] identity::DocError),
67    #[error(transparent)]
68    Io(#[from] io::Error),
69    #[error(transparent)]
70    Init(#[from] fetch::handle::error::Init),
71    #[error(transparent)]
72    Storage(#[from] storage::Error),
73    #[error(transparent)]
74    Repository(#[from] radicle::storage::RepositoryError),
75}
76
77#[derive(Debug, Error)]
78pub enum Canonical {
79    #[error(transparent)]
80    Identity(#[from] radicle::storage::RepositoryError),
81    #[error(transparent)]
82    CanonicalRefs(#[from] radicle::identity::doc::CanonicalRefsError),
83}