@@ -4,6 +4,21 @@ module JS = Json_schema.Make (Json_repr.Yojson)
44module JE = Json_encoding. Make (Json_repr. Yojson )
55module JQ = Json_query. Make (Json_repr. Yojson )
66
7+ (* copied & modified from json_encoding.ml *)
8+ let unexpected kind expected =
9+ let kind =
10+ match Json_repr. from_yojson kind with
11+ | `O [] -> " empty object"
12+ | `A [] -> " empty array"
13+ | `O _ -> " object"
14+ | `A _ -> " array"
15+ | `Null -> " null"
16+ | `String _ -> " string"
17+ | `Float _ -> " number"
18+ | `Bool _ -> " boolean"
19+ in
20+ Json_encoding. Cannot_destruct ([] , Json_encoding. Unexpected (kind, expected))
21+
722let schema_to_yojson schema = JS. to_json schema
823let schema_of_yojson json = JS. of_json json
924
@@ -33,15 +48,36 @@ let rec encoding_of_schema_element (top: unit Json_encoding.encoding) (schema_el
3348 | Id_ref "" ->
3449 top
3550 | Object object_specs ->
36- List. fold_left (fun acc (name , element , required , _ ) ->
51+ let properties_encoding = List. fold_left (fun acc (name , element , required , _ ) ->
3752 let field =
3853 if required then
3954 req name (encoding_of_schema_element top element)
4055 else
4156 dft name (encoding_of_schema_element top element) ()
4257 in
4358 erase @@ merge_objs acc (obj1 field)
44- ) (Option. map_default (encoding_of_schema_element top) empty object_specs.additional_properties) object_specs.properties
59+ ) empty object_specs.properties
60+ in
61+ begin match object_specs.additional_properties with
62+ | Some additional_properties ->
63+ let additional_encoding = encoding_of_schema_element top additional_properties in
64+ JE. custom (fun _ -> failwith " erase construct" ) (function
65+ | `Assoc fields ->
66+ let is_properties_field (name , _ ) = List. exists (fun (name' , _ , _ , _ ) -> name = name') object_specs.properties in
67+ let (properties_fields, additional_fields) = List. partition is_properties_field fields in
68+ JE. destruct properties_encoding (`Assoc properties_fields);
69+ List. iter (fun (name , value ) ->
70+ try
71+ JE. destruct additional_encoding value
72+ with Cannot_destruct (path , err ) ->
73+ raise (Cannot_destruct (`Field name :: path, err))
74+ ) additional_fields
75+ | j ->
76+ raise (unexpected j " object" )
77+ ) ~schema: (Json_schema. create schema_element)
78+ | None ->
79+ properties_encoding
80+ end
4581 | _ -> failwith (Format. asprintf " encoding_of_schema_element: %a" Json_schema. pp (Json_schema. create schema_element))
4682
4783let encoding_of_schema (schema : Json_schema.schema ): unit Json_encoding.encoding =
@@ -50,23 +86,30 @@ let encoding_of_schema (schema: Json_schema.schema): unit Json_encoding.encoding
5086
5187open Json_schema
5288
53- let rec element_defaults (element : element ): Yojson.Safe.t =
89+ let rec element_defaults ? additional_field (element : element ): Yojson.Safe.t =
5490 match element.default with
5591 | Some default ->
5692 Json_repr. any_to_repr (module Json_repr. Yojson ) default
5793 | None ->
5894 begin match element.kind with
5995 | Object object_specs ->
60- `Assoc (List. map (fun (name , field_element , _ , _ ) ->
61- (name, element_defaults field_element)
96+ let additional = match additional_field, object_specs.additional_properties with
97+ | Some additional_field , Some additional_properties ->
98+ (* create additional field with the additionalProperties default value for lookup in GobConfig *)
99+ [(additional_field, element_defaults ~additional_field additional_properties)]
100+ | _ , _ ->
101+ []
102+ in
103+ `Assoc (additional @ List. map (fun (name , field_element , _ , _ ) ->
104+ (name, element_defaults ?additional_field field_element)
62105 ) object_specs.properties)
63106 | _ ->
64107 Format. printf " %a\n " Json_schema. pp (create element);
65108 failwith " element_defaults"
66109 end
67110
68- let schema_defaults (schema : schema ): Yojson.Safe.t =
69- element_defaults (root schema)
111+ let schema_defaults ? additional_field (schema : schema ): Yojson.Safe.t =
112+ element_defaults ?additional_field (root schema)
70113
71114let create_schema element =
72115 create @@ { element with id = Some " " } (* add id to make create defs check happy for phases Id_ref, doesn't get outputted apparently *)
0 commit comments