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}