aboutsummaryrefslogtreecommitdiffstats
path: root/lib/error.ml
blob: 09b2e536cea66bc5d61164fdf038d8435e2e8fc4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(** Error types for manipulation operations *)
type t =
  | RelationNotFound of string
  | RelationAlreadyExists of string
  | TupleNotFound of Conventions.Hash.t
  | DuplicateTuple of Conventions.Hash.t
  | ConstraintViolation of string
  | StorageError of string
  | UnrecognizedSublanguage of string
  | MalformedExpression of Sexplib.Sexp.t
  (* TODO: think of a better way to manage and serialize sublanguage errors *)
  | SublanguageError of Sexplib.Sexp.t
  | Conflict of { old_db : Management.Database.t; new_db : Management.Database.t}
  | SyntaxError of string
  | MultigroupNotFound of string

let sexp_of_error e =
  let open Sexplib.Sexp in
  let error e ps = List (Atom e :: ps) in
  let (<+>) key value = List [Atom key; value] in
  match e with
  (* TODO: think of a subset of common attributes that every error should have (message, etc)? *)
  | RelationNotFound s          -> error "relation-not-found"       ["relation"   <+> (Atom s)]
  | RelationAlreadyExists s     -> error "relation-already-exists"  ["relation"   <+> (Atom s)]
  | TupleNotFound h             -> error "tuple-not-found"          ["hash"       <+> (Atom h)]
  | DuplicateTuple h            -> error "duplicate-tuple"          ["hash"       <+> (Atom h)]
  | ConstraintViolation s       -> error "constraint-violation"     ["message"    <+> (Atom s)]
  | StorageError s              -> error "storage-error"            ["message"    <+> (Atom s)]
  | UnrecognizedSublanguage s   -> error "unrecognized-sublanguage" ["tag"        <+> (Atom s)]
  | MalformedExpression s       -> error "malformed-expression"     ["expression" <+> s]
  | SublanguageError s          -> error "sublanguage-error"        ["error"      <+> s]
  | SyntaxError s               -> error "syntax-error"             ["message"    <+> (Atom s)]
  | MultigroupNotFound s        -> error "multigroup-not-found"     ["name"       <+> (Atom s)]
  | Conflict { old_db; new_db } -> error "conflict"                 ["old-hash"   <+> (Atom old_db.hash);
                                                                     "new-hash"   <+> (Atom new_db.hash)]