sig
  module type S =
    sig
      type r
      type t = r record
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
      val default : t
      val has : (Data.Record.S.r, 'a) Data.field -> t -> bool
      val get : (Data.Record.S.r, 'a) Data.field -> t -> 'a
      val set : (Data.Record.S.r, 'a) Data.field -> '-> t -> t
    end
  val signature :
    page:Doc.page ->
    name:string -> descr:Markdown.text -> unit -> 'Data.signature
  val field :
    'Data.signature ->
    name:string ->
    descr:Markdown.text -> ?default:'-> 'Data.data -> ('r, 'a) Data.field
  val option :
    'Data.signature ->
    name:string ->
    descr:Markdown.text -> 'Data.data -> ('r, 'a option) Data.field
  val publish : 'Data.signature -> (module Data.Record.S with type r = 'a)
end