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