aboutsummaryrefslogtreecommitdiff
path: root/lib/kernel/lectionary.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kernel/lectionary.ml')
-rw-r--r--lib/kernel/lectionary.ml13
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/kernel/lectionary.ml b/lib/kernel/lectionary.ml
index 1da3d1e..2d478e6 100644
--- a/lib/kernel/lectionary.ml
+++ b/lib/kernel/lectionary.ml
@@ -26,8 +26,21 @@ let load path =
| exception Sexplib.Sexp.Parse_error e ->
Error (Printf.sprintf "lectionary: %s: %s" path e.err_msg)
| exception Sys_error e -> Error (Printf.sprintf "lectionary: %s" e)
+ (* Mirrors Layer.load/Overlay.load: this sexplib version raises [Failure]
+ for some malformed inputs (e.g. an unterminated list or string, an
+ empty file, or a file holding more than one sexp) rather than
+ [Sexplib.Sexp.Parse_error], so a catch-all here -- placed last among the
+ exception branches -- is what actually keeps every parse failure inside
+ [Error] instead of escaping. *)
+ | exception exn -> Error (Printf.sprintf "lectionary: %s: %s" path (Printexc.to_string exn))
| sexp -> (
match t_of_sexp sexp with
| exception Sexplib0.Sexp_conv_error.Of_sexp_error (exn, _) ->
Error (Printf.sprintf "lectionary: %s: %s" path (Printexc.to_string exn))
+ (* Defence in depth: every conversion below is currently
+ [Of_sexp_error] (including [Slug.t_of_sexp] on a malformed slug
+ atom), but [t_of_sexp] is derived and could raise something else
+ after a future type change -- this catch-all is what would keep
+ that inside [Error] too, the same reasoning as the outer one above. *)
+ | exception exn -> Error (Printf.sprintf "lectionary: %s: %s" path (Printexc.to_string exn))
| parsed -> of_entries parsed)