package ppx_deriving_jsonschema

  1. Overview
  2. Docs

Source file ppx_deriving_jsonschema_runtime.ml

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
let schema_version = "https://json-schema.org/draft/2020-12/schema"

(* There is no Yojson.Basic.t in Melange and the Melange_json.t is not compatible with Yojson.Basic.t,
   so we use our own type to support universal API. Platform-specific conversion is in classify.ml
   (native: Obj.magic coercion; Melange: Js.Json decode). *)

type t =
  [ `Null
  | `String of string
  | `Float of float
  | `Int of int
  | `Bool of bool
  | `List of t list
  | `Assoc of (string * t) list
  ]

let classify = Ppx_deriving_jsonschema_classify.classify

let json_schema ?id ?title ?description ?definitions types =
  match types with
  | `Assoc types ->
    let metadata =
      List.filter_map
        (fun x -> x)
        [
          Some ("$schema", `String schema_version);
          (match id with
          | None -> None
          | Some id -> Some ("$id", `String id));
          (match title with
          | None -> None
          | Some title -> Some ("title", `String title));
          (match description with
          | None -> None
          | Some description -> Some ("description", `String description));
          (match definitions with
          | None -> None
          | Some defs -> Some ("$defs", `Assoc defs));
        ]
    in
    `Assoc (metadata @ types)