aboutsummaryrefslogtreecommitdiffstats
path: root/lib/error.ml
blob: b19aebbf31844fff038da48b6412d50d5ceee936 (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
37
38
39
40
41
42
(** 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.Multigroup.multigroup;
      new_db : Management.Multigroup.multigroup;
    }
  | 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" <+> Atom old_db#name; "new" <+> Atom new_db#name ]