Current section
Files
Jump to
Current section
Files
src/json@blueprint@schema.erl
-module(json@blueprint@schema).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new_schema/1, type_constraint/1, string_constraint/4, number_constraint/5, to_json/1, to_json_string/1]).
-export_type([schema/0, schema_definition/0, schema_type/0, string_format/0]).
-type schema() :: {schema,
schema_definition(),
gleam@option:option(list(binary())),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(list({binary(), schema_definition()}))}.
-type schema_definition() :: {type, schema_type()} |
{enum, list(gleam@json:json())} |
{const, gleam@json:json()} |
{nullable, schema_definition()} |
{number,
gleam@option:option(float()),
gleam@option:option(float()),
gleam@option:option(float()),
gleam@option:option(float()),
gleam@option:option(float())} |
{string,
gleam@option:option(integer()),
gleam@option:option(integer()),
gleam@option:option(binary()),
gleam@option:option(string_format())} |
{array, gleam@option:option(schema_definition())} |
{detailed_array,
gleam@option:option(schema_definition()),
gleam@option:option(list(schema_definition())),
gleam@option:option(integer()),
gleam@option:option(integer()),
gleam@option:option(boolean()),
gleam@option:option(schema_definition()),
gleam@option:option(integer()),
gleam@option:option(integer())} |
{object,
list({binary(), schema_definition()}),
gleam@option:option(boolean()),
gleam@option:option(list(binary()))} |
{detailed_object,
gleam@option:option(list({binary(), schema_definition()})),
gleam@option:option(list({binary(), schema_definition()})),
gleam@option:option(schema_definition()),
gleam@option:option(list(binary())),
gleam@option:option(schema_definition()),
gleam@option:option(integer()),
gleam@option:option(integer())} |
{all_of, list(schema_definition())} |
{any_of, list(schema_definition())} |
{one_of, list(schema_definition())} |
{'not', schema_definition()} |
{ref, binary()} |
true_value |
false_value.
-type schema_type() :: null |
boolean_type |
object_type |
array_type |
number_type |
string_type |
integer_type |
{multiple, list(schema_type())}.
-type string_format() :: date_time |
date |
time |
duration |
email |
idn_email |
hostname |
idn_hostname |
ipv4 |
ipv6 |
uri |
uri_reference |
iri |
iri_reference |
uri_template |
json_pointer |
relative_json_pointer |
regex.
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 131).
-spec new_schema(schema_definition()) -> schema().
new_schema(Definition) ->
{schema, Definition, none, none, none, none}.
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 142).
-spec type_constraint(schema_type()) -> schema_definition().
type_constraint(Type_) ->
{type, Type_}.
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 147).
-spec string_constraint(
gleam@option:option(integer()),
gleam@option:option(integer()),
gleam@option:option(binary()),
gleam@option:option(string_format())
) -> schema_definition().
string_constraint(Min_length, Max_length, Pattern, Format) ->
{string, Min_length, Max_length, Pattern, Format}.
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 162).
-spec number_constraint(
gleam@option:option(float()),
gleam@option:option(float()),
gleam@option:option(float()),
gleam@option:option(float()),
gleam@option:option(float())
) -> schema_definition().
number_constraint(
Minimum,
Maximum,
Exclusive_minimum,
Exclusive_maximum,
Multiple_of
) ->
{number,
Minimum,
Maximum,
Exclusive_minimum,
Exclusive_maximum,
Multiple_of}.
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 213).
-spec prepend_option(
list({binary(), gleam@json:json()}),
gleam@option:option(FZD),
binary(),
fun((FZD) -> gleam@json:json())
) -> list({binary(), gleam@json:json()}).
prepend_option(List, Maybe, Name, To_json) ->
case Maybe of
{some, Value} ->
gleam@list:prepend(List, {Name, To_json(Value)});
none ->
List
end.
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 370).
-spec schema_type_to_json(schema_type()) -> gleam@json:json().
schema_type_to_json(Type_) ->
case Type_ of
null ->
gleam@json:string(<<"null"/utf8>>);
boolean_type ->
gleam@json:string(<<"boolean"/utf8>>);
object_type ->
gleam@json:string(<<"object"/utf8>>);
array_type ->
gleam@json:string(<<"array"/utf8>>);
number_type ->
gleam@json:string(<<"number"/utf8>>);
string_type ->
gleam@json:string(<<"string"/utf8>>);
integer_type ->
gleam@json:string(<<"integer"/utf8>>);
{multiple, Types} ->
gleam@json:array(Types, fun(T) -> schema_type_to_json(T) end)
end.
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 384).
-spec string_format_to_string(string_format()) -> binary().
string_format_to_string(Format) ->
case Format of
date_time ->
<<"date-time"/utf8>>;
date ->
<<"date"/utf8>>;
time ->
<<"time"/utf8>>;
duration ->
<<"duration"/utf8>>;
email ->
<<"email"/utf8>>;
idn_email ->
<<"idn-email"/utf8>>;
hostname ->
<<"hostname"/utf8>>;
idn_hostname ->
<<"idn-hostname"/utf8>>;
ipv4 ->
<<"ipv4"/utf8>>;
ipv6 ->
<<"ipv6"/utf8>>;
uri ->
<<"uri"/utf8>>;
uri_reference ->
<<"uri-reference"/utf8>>;
iri ->
<<"iri"/utf8>>;
iri_reference ->
<<"iri-reference"/utf8>>;
uri_template ->
<<"uri-template"/utf8>>;
json_pointer ->
<<"json-pointer"/utf8>>;
relative_json_pointer ->
<<"relative-json-pointer"/utf8>>;
regex ->
<<"regex"/utf8>>
end.
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 228).
-spec schema_definition_to_json_fields(schema_definition()) -> list({binary(),
gleam@json:json()}).
schema_definition_to_json_fields(Def) ->
case Def of
{type, Type_} ->
[{<<"type"/utf8>>, schema_type_to_json(Type_)}];
{enum, Values} ->
[{<<"enum"/utf8>>, gleam@json:preprocessed_array(Values)}];
{const, Value} ->
[{<<"const"/utf8>>, Value}];
{nullable, Schema} ->
schema_definition_to_json_fields(Schema);
{number,
Minimum,
Maximum,
Exclusive_minimum,
Exclusive_maximum,
Multiple_of} ->
_pipe = [],
_pipe@1 = prepend_option(
_pipe,
Minimum,
<<"minimum"/utf8>>,
fun gleam@json:float/1
),
_pipe@2 = prepend_option(
_pipe@1,
Maximum,
<<"maximum"/utf8>>,
fun gleam@json:float/1
),
_pipe@3 = prepend_option(
_pipe@2,
Exclusive_minimum,
<<"exclusiveMinimum"/utf8>>,
fun gleam@json:float/1
),
_pipe@4 = prepend_option(
_pipe@3,
Exclusive_maximum,
<<"exclusiveMaximum"/utf8>>,
fun gleam@json:float/1
),
prepend_option(
_pipe@4,
Multiple_of,
<<"multipleOf"/utf8>>,
fun gleam@json:float/1
);
{string, Min_length, Max_length, Pattern, Format} ->
_pipe@5 = [],
_pipe@6 = prepend_option(
_pipe@5,
Min_length,
<<"minLength"/utf8>>,
fun gleam@json:int/1
),
_pipe@7 = prepend_option(
_pipe@6,
Max_length,
<<"maxLength"/utf8>>,
fun gleam@json:int/1
),
_pipe@8 = prepend_option(
_pipe@7,
Pattern,
<<"pattern"/utf8>>,
fun gleam@json:string/1
),
prepend_option(
_pipe@8,
Format,
<<"format"/utf8>>,
fun(F) -> gleam@json:string(string_format_to_string(F)) end
);
{array, Items} ->
prepend_option(
[],
Items,
<<"items"/utf8>>,
fun(Schema@1) -> schema_definition_to_json(Schema@1) end
);
{object, Properties, Additional_properties, Required} ->
_pipe@9 = [{<<"type"/utf8>>, gleam@json:string(<<"object"/utf8>>)},
{<<"properties"/utf8>>,
gleam@json:object(
gleam@list:map(
Properties,
fun(Prop) ->
{erlang:element(1, Prop),
schema_definition_to_json(
erlang:element(2, Prop)
)}
end
)
)}],
_pipe@10 = prepend_option(
_pipe@9,
Additional_properties,
<<"additionalProperties"/utf8>>,
fun gleam@json:bool/1
),
prepend_option(
_pipe@10,
Required,
<<"required"/utf8>>,
fun(_capture) ->
gleam@json:array(_capture, fun gleam@json:string/1)
end
);
{detailed_array,
Items@1,
Prefix_items,
Min_items,
Max_items,
Unique_items,
Contains,
Min_contains,
Max_contains} ->
_pipe@11 = [],
_pipe@12 = prepend_option(
_pipe@11,
Items@1,
<<"items"/utf8>>,
fun(Schema@2) -> schema_definition_to_json(Schema@2) end
),
_pipe@13 = prepend_option(
_pipe@12,
Prefix_items,
<<"prefixItems"/utf8>>,
fun(Schemas) ->
gleam@json:array(Schemas, fun schema_definition_to_json/1)
end
),
_pipe@14 = prepend_option(
_pipe@13,
Min_items,
<<"minItems"/utf8>>,
fun gleam@json:int/1
),
_pipe@15 = prepend_option(
_pipe@14,
Max_items,
<<"maxItems"/utf8>>,
fun gleam@json:int/1
),
_pipe@16 = prepend_option(
_pipe@15,
Unique_items,
<<"uniqueItems"/utf8>>,
fun gleam@json:bool/1
),
_pipe@17 = prepend_option(
_pipe@16,
Contains,
<<"contains"/utf8>>,
fun(Schema@3) -> schema_definition_to_json(Schema@3) end
),
_pipe@18 = prepend_option(
_pipe@17,
Min_contains,
<<"minContains"/utf8>>,
fun gleam@json:int/1
),
prepend_option(
_pipe@18,
Max_contains,
<<"maxContains"/utf8>>,
fun gleam@json:int/1
);
{detailed_object,
Properties@1,
Pattern_properties,
Additional_properties@1,
Required@1,
Property_names,
Min_properties,
Max_properties} ->
_pipe@19 = [],
_pipe@20 = prepend_option(
_pipe@19,
Properties@1,
<<"properties"/utf8>>,
fun(Props) ->
gleam@json:object(
gleam@list:map(
Props,
fun(Prop@1) ->
{erlang:element(1, Prop@1),
schema_definition_to_json(
erlang:element(2, Prop@1)
)}
end
)
)
end
),
_pipe@21 = prepend_option(
_pipe@20,
Pattern_properties,
<<"patternProperties"/utf8>>,
fun(Patterns) ->
gleam@json:object(
gleam@list:map(
Patterns,
fun(Pattern@1) ->
{erlang:element(1, Pattern@1),
schema_definition_to_json(
erlang:element(2, Pattern@1)
)}
end
)
)
end
),
_pipe@22 = prepend_option(
_pipe@21,
Additional_properties@1,
<<"additionalProperties"/utf8>>,
fun(Schema@4) -> schema_definition_to_json(Schema@4) end
),
_pipe@23 = prepend_option(
_pipe@22,
Required@1,
<<"required"/utf8>>,
fun(Reqs) -> gleam@json:array(Reqs, fun gleam@json:string/1) end
),
_pipe@24 = prepend_option(
_pipe@23,
Property_names,
<<"propertyNames"/utf8>>,
fun(Schema@5) -> schema_definition_to_json(Schema@5) end
),
_pipe@25 = prepend_option(
_pipe@24,
Min_properties,
<<"minProperties"/utf8>>,
fun gleam@json:int/1
),
prepend_option(
_pipe@25,
Max_properties,
<<"maxProperties"/utf8>>,
fun gleam@json:int/1
);
{all_of, Schemas@1} ->
[{<<"allOf"/utf8>>,
gleam@json:array(Schemas@1, fun schema_definition_to_json/1)}];
{any_of, Schemas@2} ->
[{<<"anyOf"/utf8>>,
gleam@json:array(Schemas@2, fun schema_definition_to_json/1)}];
{one_of, Schemas@3} ->
[{<<"oneOf"/utf8>>,
gleam@json:array(Schemas@3, fun schema_definition_to_json/1)}];
{'not', Schema@6} ->
[{<<"not"/utf8>>, schema_definition_to_json(Schema@6)}];
{ref, Ref} ->
[{<<"$ref"/utf8>>, gleam@json:string(Ref)}];
true_value ->
[{<<"type"/utf8>>, gleam@json:bool(true)}];
false_value ->
[{<<"type"/utf8>>, gleam@json:bool(false)}]
end.
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 209).
-spec schema_definition_to_json(schema_definition()) -> gleam@json:json().
schema_definition_to_json(Def) ->
gleam@json:object(schema_definition_to_json_fields(Def)).
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 186).
-spec to_json(schema()) -> gleam@json:json().
to_json(Schema) ->
Fields = begin
_pipe = [{<<"$schema"/utf8>>,
gleam@json:string(
<<"http://json-schema.org/draft-07/schema#"/utf8>>
)}],
_pipe@1 = prepend_option(
_pipe,
erlang:element(3, Schema),
<<"$vocabulary"/utf8>>,
fun(Vocab) -> gleam@json:array(Vocab, fun gleam@json:string/1) end
),
_pipe@2 = prepend_option(
_pipe@1,
erlang:element(4, Schema),
<<"$id"/utf8>>,
fun gleam@json:string/1
),
_pipe@3 = prepend_option(
_pipe@2,
erlang:element(5, Schema),
<<"$comment"/utf8>>,
fun gleam@json:string/1
),
prepend_option(
_pipe@3,
erlang:element(6, Schema),
<<"$defs"/utf8>>,
fun(Defs) ->
gleam@json:object(
gleam@list:map(
Defs,
fun(Def) ->
{erlang:element(1, Def),
schema_definition_to_json(
erlang:element(2, Def)
)}
end
)
)
end
)
end,
Schema_fields = schema_definition_to_json_fields(erlang:element(2, Schema)),
Fields@1 = lists:append(Fields, Schema_fields),
gleam@json:object(Fields@1).
-file("/code/edgar/gleamplay/src/json/blueprint/schema.gleam", 179).
-spec to_json_string(schema()) -> binary().
to_json_string(Schema) ->
_pipe = Schema,
_pipe@1 = to_json(_pipe),
gleam@json:to_string(_pipe@1).