Hi,
I wondered how safe it is to use Marshal strings of arbitrary ocaml objects to create a generic content type for Irmin. I came up with the following code for a content type for all sexp serializable types:
module type SexpType = sig
type t
val t_of_sexp : Sexplib.Sexp.t -> t
val sexp_of_t : t -> Sexplib.Sexp.t
end
module SexpContent(
T : SexpType
) : Irmin.Contents.S with type t = T.t =
struct
type t = T.t
let to_raw (x:t) = Marshal.to_string x []
let of_raw x : t = Marshal.from_string x 0
let t = Irmin.Type.(like string) of_raw to_raw
let merge = Irmin.Merge.idempotent (Irmin.Type.option t)
let of_string s =
Ok (T.t_of_sexp @@ Sexplib.Sexp.of_string s)
let pp ppf x =
Fmt.pf ppf "%s" (to_string x)
end
How safe is this code? Since the pp and of_string use the sexp representation, I assume the Marshal string is only used by the running Irmin instance and not by anything that could have a different ocaml version, so it should be safe. Is this assumption correct?
Thank you in advance!
Cheers,
Sven