Skip to main content

xet_core_structures/
error.rs

1use thiserror::Error;
2use tracing::warn;
3
4use crate::merklehash::{DataHashError, MerkleHash};
5
6#[non_exhaustive]
7#[derive(Error, Debug)]
8pub enum CoreError {
9    // -- Common ----------------------------------------------------------
10    #[error("I/O error: {0}")]
11    Io(#[from] std::io::Error),
12
13    #[error("Internal error: {0}")]
14    InternalError(String),
15
16    #[error("{0}")]
17    Other(String),
18
19    // -- Shard-specific --------------------------------------------------
20    #[error("Too many collisions for truncated hash: {0}")]
21    TruncatedHashCollision(u64),
22
23    #[error("Shard version error: {0}")]
24    ShardVersion(String),
25
26    #[error("Bad filename: {0}")]
27    BadFilename(String),
28
29    #[error("Shard not found: {0}")]
30    ShardNotFound(MerkleHash),
31
32    #[error("File not found: {0}")]
33    FileNotFound(MerkleHash),
34
35    #[error("Query failed: {0}")]
36    QueryFailed(String),
37
38    #[error("Smudge query policy error: {0}")]
39    SmudgeQueryPolicy(String),
40
41    #[error("Invalid shard: {0}")]
42    InvalidShard(String),
43
44    // -- XORB-specific ---------------------------------------------------
45    #[error("Invalid range")]
46    InvalidRange,
47
48    #[error("Invalid arguments")]
49    InvalidArguments,
50
51    #[error("Malformed data: {0}")]
52    MalformedData(String),
53
54    #[error("Hash mismatch")]
55    HashMismatch,
56
57    #[error("Compression error: {0}")]
58    CompressionError(#[from] lz4_flex::frame::Error),
59
60    #[error("Hash parsing error: {0}")]
61    HashParsing(#[from] DataHashError),
62
63    #[error("Chunk header parse error")]
64    ChunkHeaderParse,
65
66    // -- Runtime ---------------------------------------------------------
67    #[error("Runtime error: {0}")]
68    RuntimeError(#[from] xet_runtime::RuntimeError),
69
70    #[error("Task lock error: {0}")]
71    TaskRuntime(#[from] xet_runtime::utils::RwTaskLockError),
72
73    #[error("Task join error: {0}")]
74    TaskJoin(#[from] tokio::task::JoinError),
75}
76
77pub type Result<T> = std::result::Result<T, CoreError>;
78
79impl PartialEq for CoreError {
80    fn eq(&self, other: &CoreError) -> bool {
81        std::mem::discriminant(self) == std::mem::discriminant(other)
82    }
83}
84
85impl CoreError {
86    pub fn other(inner: impl ToString) -> Self {
87        Self::Other(inner.to_string())
88    }
89
90    pub fn invalid_shard(inner: impl ToString) -> Self {
91        Self::InvalidShard(inner.to_string())
92    }
93}
94
95/// Helper trait to swallow XORB object format errors during validation.
96pub trait Validate<T> {
97    fn ok_for_format_error(self) -> Result<Option<T>>;
98}
99
100impl<T> Validate<T> for Result<T> {
101    fn ok_for_format_error(self) -> Result<Option<T>> {
102        match self {
103            Ok(v) => Ok(Some(v)),
104            Err(CoreError::MalformedData(e)) => {
105                warn!("XORB Validation: {e}");
106                Ok(None)
107            },
108            Err(e) => Err(e),
109        }
110    }
111}