Skip to main content

omnigraph/
error.rs

1use thiserror::Error;
2
3pub type Result<T> = std::result::Result<T, OmniError>;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum ManifestErrorKind {
7    BadRequest,
8    NotFound,
9    Conflict,
10    Internal,
11}
12
13#[derive(Debug, Clone, Error)]
14#[error("{message}")]
15pub struct ManifestError {
16    pub kind: ManifestErrorKind,
17    pub message: String,
18}
19
20impl ManifestError {
21    pub fn new(kind: ManifestErrorKind, message: impl Into<String>) -> Self {
22        Self {
23            kind,
24            message: message.into(),
25        }
26    }
27}
28
29#[derive(Debug, Clone)]
30pub struct MergeConflict {
31    pub table_key: String,
32    pub row_id: Option<String>,
33    pub kind: MergeConflictKind,
34    pub message: String,
35}
36
37#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38pub enum MergeConflictKind {
39    DivergentInsert,
40    DivergentUpdate,
41    DeleteVsUpdate,
42    OrphanEdge,
43    UniqueViolation,
44    CardinalityViolation,
45    ValueConstraintViolation,
46}
47
48#[derive(Debug, Error)]
49pub enum OmniError {
50    #[error("{0}")]
51    Compiler(#[from] omnigraph_compiler::error::NanoError),
52    #[error("storage: {0}")]
53    Lance(String),
54    #[error("query: {0}")]
55    DataFusion(String),
56    #[error("io: {0}")]
57    Io(#[from] std::io::Error),
58    #[error("{0}")]
59    Manifest(ManifestError),
60    #[error("merge conflicts: {0:?}")]
61    MergeConflicts(Vec<MergeConflict>),
62}
63
64impl OmniError {
65    pub fn manifest(message: impl Into<String>) -> Self {
66        Self::Manifest(ManifestError::new(ManifestErrorKind::BadRequest, message))
67    }
68
69    pub fn manifest_not_found(message: impl Into<String>) -> Self {
70        Self::Manifest(ManifestError::new(ManifestErrorKind::NotFound, message))
71    }
72
73    pub fn manifest_conflict(message: impl Into<String>) -> Self {
74        Self::Manifest(ManifestError::new(ManifestErrorKind::Conflict, message))
75    }
76
77    pub fn manifest_internal(message: impl Into<String>) -> Self {
78        Self::Manifest(ManifestError::new(ManifestErrorKind::Internal, message))
79    }
80}