-module(json_typedef). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([codegen/0, root_name/2, generate_encoders/2, generate_decoders/2, generate/2, decoder/1, to_json/1]). -export_type([root_schema/0, type/0, schema/0, properties_schema/0, generator/0, out/0, codegen_error/0, property_data_name/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC( " \n" "\n" " \n" ). -type root_schema() :: {root_schema, list({binary(), schema()}), schema()}. -type type() :: boolean | string | timestamp | float32 | float64 | int8 | uint8 | int16 | uint16 | int32 | uint32. -type schema() :: empty | {type, boolean(), list({binary(), gleam@dynamic:dynamic_()}), type()} | {enum, boolean(), list({binary(), gleam@dynamic:dynamic_()}), list(binary())} | {properties, boolean(), list({binary(), gleam@dynamic:dynamic_()}), properties_schema()} | {elements, boolean(), list({binary(), gleam@dynamic:dynamic_()}), schema()} | {values, boolean(), list({binary(), gleam@dynamic:dynamic_()}), schema()} | {discriminator, boolean(), list({binary(), gleam@dynamic:dynamic_()}), binary(), list({binary(), properties_schema()})} | {ref, boolean(), list({binary(), gleam@dynamic:dynamic_()}), binary()}. -type properties_schema() :: {properties_schema, list({binary(), schema()}), list({binary(), schema()}), boolean()}. -opaque generator() :: {generator, boolean(), boolean(), boolean(), boolean(), boolean(), boolean(), gleam@dict:dict(binary(), binary()), gleam@dict:dict(binary(), binary()), binary(), gleam@set:set(binary())}. -type out() :: {out, binary(), binary()}. -type codegen_error() :: cannot_convert_empty_to_json_error | empty_enum_error | {duplicate_property_error, binary(), binary(), binary()} | {duplicate_constructor_error, binary()} | {duplicate_type_error, binary()} | {duplicate_function_error, binary()}. -type property_data_name() :: property_data_none | property_data_direct | {property_data_access, binary()}. -file("src/json_typedef.gleam", 174). -spec type_to_json(type()) -> gleam@json:json(). type_to_json(T) -> gleam@json:string(case T of boolean -> <<"boolean"/utf8>>; float32 -> <<"float32"/utf8>>; float64 -> <<"float64"/utf8>>; int16 -> <<"int16"/utf8>>; int32 -> <<"int32"/utf8>>; int8 -> <<"int8"/utf8>>; string -> <<"string"/utf8>>; timestamp -> <<"timestamp"/utf8>>; uint16 -> <<"uint16"/utf8>>; uint32 -> <<"uint32"/utf8>>; uint8 -> <<"uint8"/utf8>> end). -file("src/json_typedef.gleam", 230). -spec key_decoder( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary(), fun((gleam@dynamic:dynamic_(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())) -> {ok, MEB} | {error, list(gleam@dynamic:decode_error())}) ) -> {ok, fun(() -> {ok, MEB} | {error, list(gleam@dynamic:decode_error())})} | {error, nil}. key_decoder(Dict, Key, Constructor) -> case gleam_stdlib:map_get(Dict, Key) of {ok, Value} -> {ok, fun() -> Constructor(Value, Dict) end}; {error, E} -> {error, E} end. -file("src/json_typedef.gleam", 260). -spec decode_object_as_list( gleam@dynamic:dynamic_(), fun((gleam@dynamic:dynamic_()) -> {ok, MEP} | {error, list(gleam@dynamic:decode_error())}) ) -> {ok, list({binary(), MEP})} | {error, list(gleam@dynamic:decode_error())}. decode_object_as_list(Data, Inner) -> _pipe = (gleam@dynamic:dict(fun gleam@dynamic:string/1, Inner))(Data), gleam@result:map(_pipe, fun maps:to_list/1). -file("src/json_typedef.gleam", 347). -spec decode_empty(gleam@dict:dict(binary(), gleam@dynamic:dynamic_())) -> {ok, schema()} | {error, list(gleam@dynamic:decode_error())}. decode_empty(Data) -> case maps:size(Data) of 0 -> {ok, empty}; _ -> {error, [{decode_error, <<"Schema"/utf8>>, <<"Dict"/utf8>>, []}]} end. -file("src/json_typedef.gleam", 378). -spec push_path( {ok, MGH} | {error, list(gleam@dynamic:decode_error())}, binary() ) -> {ok, MGH} | {error, list(gleam@dynamic:decode_error())}. push_path(Result, Segment) -> gleam@result:map_error( Result, fun(_capture) -> gleam@list:map(_capture, fun(E) -> _record = E, {decode_error, erlang:element(2, _record), erlang:element(3, _record), [Segment | erlang:element(4, E)]} end) end ). -file("src/json_typedef.gleam", 388). -spec get_metadata(gleam@dict:dict(binary(), gleam@dynamic:dynamic_())) -> {ok, list({binary(), gleam@dynamic:dynamic_()})} | {error, list(gleam@dynamic:decode_error())}. get_metadata(Data) -> case gleam_stdlib:map_get(Data, <<"metadata"/utf8>>) of {ok, Data@1} -> _pipe = (gleam@dynamic:dict( fun gleam@dynamic:string/1, fun gleam@dynamic:dynamic/1 ))(Data@1), _pipe@1 = gleam@result:map(_pipe, fun maps:to_list/1), push_path(_pipe@1, <<"metadata"/utf8>>); {error, _} -> {ok, []} end. -file("src/json_typedef.gleam", 400). -spec get_nullable(gleam@dict:dict(binary(), gleam@dynamic:dynamic_())) -> {ok, boolean()} | {error, list(gleam@dynamic:decode_error())}. get_nullable(Data) -> case gleam_stdlib:map_get(Data, <<"nullable"/utf8>>) of {ok, Data@1} -> _pipe = gleam@dynamic:bool(Data@1), push_path(_pipe, <<"nullable"/utf8>>); {error, _} -> {ok, false} end. -file("src/json_typedef.gleam", 301). -spec decode_type( gleam@dynamic:dynamic_(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, schema()} | {error, list(gleam@dynamic:decode_error())}. decode_type(Type_, Data) -> gleam@result:'try'( begin _pipe = gleam@dynamic:string(Type_), push_path(_pipe, <<"type"/utf8>>) end, fun(Type_@1) -> gleam@result:'try'( get_nullable(Data), fun(Nullable) -> gleam@result:'try'( get_metadata(Data), fun(Metadata) -> case Type_@1 of <<"boolean"/utf8>> -> {ok, {type, Nullable, Metadata, boolean}}; <<"float32"/utf8>> -> {ok, {type, Nullable, Metadata, float32}}; <<"float64"/utf8>> -> {ok, {type, Nullable, Metadata, float64}}; <<"int16"/utf8>> -> {ok, {type, Nullable, Metadata, int16}}; <<"int32"/utf8>> -> {ok, {type, Nullable, Metadata, int32}}; <<"int8"/utf8>> -> {ok, {type, Nullable, Metadata, int8}}; <<"string"/utf8>> -> {ok, {type, Nullable, Metadata, string}}; <<"timestamp"/utf8>> -> {ok, {type, Nullable, Metadata, timestamp}}; <<"uint16"/utf8>> -> {ok, {type, Nullable, Metadata, uint16}}; <<"uint32"/utf8>> -> {ok, {type, Nullable, Metadata, uint32}}; <<"uint8"/utf8>> -> {ok, {type, Nullable, Metadata, uint8}}; _ -> {error, [{decode_error, <<"Type"/utf8>>, <<"String"/utf8>>, [<<"type"/utf8>>]}]} end end ) end ) end ). -file("src/json_typedef.gleam", 325). -spec decode_enum( gleam@dynamic:dynamic_(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, schema()} | {error, list(gleam@dynamic:decode_error())}. decode_enum(Type_, Data) -> gleam@result:'try'( get_nullable(Data), fun(Nullable) -> gleam@result:'try'( get_metadata(Data), fun(Metadata) -> _pipe = (gleam@dynamic:list(fun gleam@dynamic:string/1))( Type_ ), _pipe@1 = push_path(_pipe, <<"enum"/utf8>>), gleam@result:map( _pipe@1, fun(_capture) -> {enum, Nullable, Metadata, _capture} end ) end ) end ). -file("src/json_typedef.gleam", 336). -spec decode_ref( gleam@dynamic:dynamic_(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, schema()} | {error, list(gleam@dynamic:decode_error())}. decode_ref(Type_, Data) -> gleam@result:'try'( get_nullable(Data), fun(Nullable) -> gleam@result:'try'( get_metadata(Data), fun(Metadata) -> _pipe = gleam@dynamic:string(Type_), _pipe@1 = push_path(_pipe, <<"ref"/utf8>>), gleam@result:map( _pipe@1, fun(_capture) -> {ref, Nullable, Metadata, _capture} end ) end ) end ). -file("src/json_typedef.gleam", 409). -spec metadata_value_to_json(gleam@dynamic:dynamic_()) -> gleam@json:json(). metadata_value_to_json(Data) -> Decoder = gleam@dynamic:any([fun(A) -> _pipe = gleam@dynamic:string(A), gleam@result:map(_pipe, fun gleam@json:string/1) end, fun(A@1) -> _pipe@1 = gleam@dynamic:int(A@1), gleam@result:map(_pipe@1, fun gleam@json:int/1) end, fun(A@2) -> _pipe@2 = gleam@dynamic:float(A@2), gleam@result:map(_pipe@2, fun gleam@json:float/1) end]), case Decoder(Data) of {ok, Data@1} -> Data@1; {error, _} -> gleam@json:string(gleam@string:inspect(Data)) end. -file("src/json_typedef.gleam", 422). -spec add_metadata( list({binary(), gleam@json:json()}), list({binary(), gleam@dynamic:dynamic_()}) ) -> list({binary(), gleam@json:json()}). add_metadata(Data, Metadata) -> case Metadata of [] -> Data; _ -> Metadata@2 = gleam@list:map( Metadata, fun(Metadata@1) -> {erlang:element(1, Metadata@1), metadata_value_to_json(erlang:element(2, Metadata@1))} end ), [{<<"metadata"/utf8>>, gleam@json:object(Metadata@2)} | Data] end. -file("src/json_typedef.gleam", 438). -spec add_nullable(list({binary(), gleam@json:json()}), boolean()) -> list({binary(), gleam@json:json()}). add_nullable(Data, Nullable) -> case Nullable of false -> Data; true -> [{<<"nullable"/utf8>>, gleam@json:bool(true)} | Data] end. -file("src/json_typedef.gleam", 463). -spec codegen() -> generator(). codegen() -> {generator, false, false, false, false, false, false, maps:new(), maps:new(), <<"Data"/utf8>>, gleam@set:new()}. -file("src/json_typedef.gleam", 478). -spec root_name(generator(), binary()) -> generator(). root_name(Gen, Root_name) -> _record = Gen, {generator, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), Root_name, erlang:element(11, _record)}. -file("src/json_typedef.gleam", 482). -spec generate_encoders(generator(), boolean()) -> generator(). generate_encoders(Gen, X) -> _record = Gen, {generator, erlang:element(2, _record), X, erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)}. -file("src/json_typedef.gleam", 486). -spec generate_decoders(generator(), boolean()) -> generator(). generate_decoders(Gen, X) -> _record = Gen, {generator, X, erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)}. -file("src/json_typedef.gleam", 596). -spec type_name(schema(), binary()) -> binary(). type_name(Schema, Name) -> Nullable@1 = case Schema of empty -> false; {discriminator, Nullable, _, _, _} -> Nullable; {elements, Nullable, _, _} -> Nullable; {enum, Nullable, _, _} -> Nullable; {properties, Nullable, _, _} -> Nullable; {ref, Nullable, _, _} -> Nullable; {type, Nullable, _, _} -> Nullable; {values, Nullable, _, _} -> Nullable end, Name@2 = case Schema of {enum, _, _, _} -> Name; {properties, _, _, _} -> Name; {discriminator, _, _, _, _} -> Name; {ref, _, _, Name@1} -> Name@1; {values, _, _, Schema@1} -> <<<<"dict.Dict("/utf8, (type_name(Schema@1, Name))/binary>>/binary, ")"/utf8>>; {elements, _, _, Schema@2} -> <<<<"List("/utf8, (type_name(Schema@2, <>))/binary>>/binary, ")"/utf8>>; empty -> <<"dynamic.Dynamic"/utf8>>; {type, _, _, Type_} -> case Type_ of boolean -> <<"Bool"/utf8>>; float32 -> <<"Float"/utf8>>; float64 -> <<"Float"/utf8>>; int16 -> <<"Int"/utf8>>; int32 -> <<"Int"/utf8>>; int8 -> <<"Int"/utf8>>; uint16 -> <<"Int"/utf8>>; uint32 -> <<"Int"/utf8>>; uint8 -> <<"Int"/utf8>>; string -> <<"String"/utf8>>; timestamp -> <<"String"/utf8>> end end, case Nullable@1 of true -> <<<<"option.Option("/utf8, Name@2/binary>>/binary, ")"/utf8>>; false -> Name@2 end. -file("src/json_typedef.gleam", 674). -spec ensure_no_duplicate_properties( properties_schema(), gleam@option:option(binary()), binary(), binary() ) -> {ok, nil} | {error, codegen_error()}. ensure_no_duplicate_properties(Schema, Extra, Type_name, Constructor_name) -> Names = lists:append(erlang:element(2, Schema), erlang:element(3, Schema)), Recorded = case Extra of none -> gleam@set:new(); {some, K} -> gleam@set:from_list([justin:snake_case(K)]) end, _pipe = gleam@list:try_fold( Names, Recorded, fun(Recorded@1, Pair) -> Field_name = justin:snake_case(erlang:element(1, Pair)), Before = gleam@set:size(Recorded@1), Recorded@2 = gleam@set:insert(Recorded@1, Field_name), case Before =:= gleam@set:size(Recorded@2) of false -> {ok, Recorded@2}; true -> {error, {duplicate_property_error, Type_name, Constructor_name, Field_name}} end end ), gleam@result:replace(_pipe, nil). -file("src/json_typedef.gleam", 749). -spec ensure_constructor_unique(generator(), binary()) -> {ok, generator()} | {error, codegen_error()}. ensure_constructor_unique(Gen, Name) -> Before = gleam@set:size(erlang:element(11, Gen)), Constructors = gleam@set:insert(erlang:element(11, Gen), Name), case Before =:= gleam@set:size(Constructors) of false -> {ok, begin _record = Gen, {generator, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), Constructors} end}; true -> {error, {duplicate_constructor_error, Name}} end. -file("src/json_typedef.gleam", 775). -spec gen_register_nullable(generator(), boolean()) -> generator(). gen_register_nullable(Gen, Nullable) -> case Nullable of false -> Gen; true -> _record = Gen, {generator, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), true, erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)} end. -file("src/json_typedef.gleam", 811). -spec gen_add_function(generator(), binary(), binary()) -> {ok, generator()} | {error, codegen_error()}. gen_add_function(Gen, Name, Body) -> Before = maps:size(erlang:element(9, Gen)), Functions = gleam@dict:insert(erlang:element(9, Gen), Name, Body), case maps:size(Functions) =:= Before of false -> {ok, begin _record = Gen, {generator, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), Functions, erlang:element(10, _record), erlang:element(11, _record)} end}; true -> {error, {duplicate_function_error, Name}} end. -file("src/json_typedef.gleam", 824). -spec gen_add_type(generator(), binary(), binary()) -> {ok, generator()} | {error, codegen_error()}. gen_add_type(Gen, Name, Body) -> Before = maps:size(erlang:element(8, Gen)), Types = gleam@dict:insert(erlang:element(8, Gen), Name, Body), case maps:size(Types) =:= Before of false -> {ok, begin _record = Gen, {generator, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), Types, erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)} end}; true -> {error, {duplicate_type_error, Name}} end. -file("src/json_typedef.gleam", 761). -spec gen_enum_type(generator(), binary(), list(binary())) -> {ok, generator()} | {error, codegen_error()}. gen_enum_type(Gen, Name, Variants) -> gleam@bool:guard( Variants =:= [], {error, empty_enum_error}, fun() -> Variants@1 = begin _pipe = Variants, _pipe@1 = gleam@list:map( _pipe, fun(V) -> <<<<" "/utf8, (justin:pascal_case(V))/binary>>/binary, "\n"/utf8>> end ), gleam@string:join(_pipe@1, <<""/utf8>>) end, Src = <<<<<<<<"pub type "/utf8, Name/binary>>/binary, " {\n"/utf8>>/binary, Variants@1/binary>>/binary, "}"/utf8>>, gen_add_type(Gen, Name, Src) end ). -file("src/json_typedef.gleam", 837). -spec gen_to_string(generator()) -> binary(). gen_to_string(Gen) -> Imp = fun(Used, Module) -> case Used of true -> [<<"import "/utf8, Module/binary>>]; false -> [] end end, Imports = begin _pipe = [Imp(erlang:element(2, Gen), <<"decode"/utf8>>), Imp(erlang:element(6, Gen), <<"gleam/dict"/utf8>>), Imp(erlang:element(4, Gen), <<"gleam/dynamic"/utf8>>), Imp(erlang:element(3, Gen), <<"gleam/json"/utf8>>), Imp(erlang:element(5, Gen), <<"gleam/option"/utf8>>)], _pipe@1 = gleam@list:flatten(_pipe), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end, Defs = fun(Items) -> _pipe@2 = Items, _pipe@3 = maps:to_list(_pipe@2), _pipe@4 = gleam@list:sort( _pipe@3, fun(A, B) -> gleam@string:compare(erlang:element(1, A), erlang:element(1, B)) end ), _pipe@5 = gleam@list:map( _pipe@4, fun(A@1) -> erlang:element(2, A@1) end ), gleam@string:join(_pipe@5, <<"\n\n"/utf8>>) end, Block = fun(S) -> case S of <<""/utf8>> -> []; _ -> [S] end end, Helper__optional_property = case erlang:element(3, Gen) andalso erlang:element( 7, Gen ) of false -> []; true -> [<<"fn helper__optional_property( object: List(#(String, json.Json)), key: String, value: option.Option(a), to_json: fn(a) -> json.Json, ) -> List(#(String, json.Json)) { case value { option.Some(value) -> [#(key, to_json(value)), ..object] option.None -> object } }"/utf8>>] end, Helper__dict_to_json = case erlang:element(3, Gen) andalso erlang:element( 6, Gen ) of false -> []; true -> [<<"fn helper__dict_to_json( data: dict.Dict(String, t), to_json: fn(t) -> json.Json, ) -> json.Json { data |> dict.to_list |> list.map(fn(pair) { #(pair.0, to_json(pair.1)) }) |> json.object }"/utf8>>] end, _pipe@6 = [Block(Imports), Block(Defs(erlang:element(8, Gen))), Block(Defs(erlang:element(9, Gen))), Helper__dict_to_json, Helper__optional_property], _pipe@7 = gleam@list:flatten(_pipe@6), gleam@string:join(_pipe@7, <<"\n\n"/utf8>>). -file("src/json_typedef.gleam", 938). -spec en_ref(binary(), gleam@option:option(binary()), boolean()) -> {ok, out()} | {error, codegen_error()}. en_ref(Name, Data, Nullable) -> Src = <<(justin:snake_case(Name))/binary, "_to_json"/utf8>>, Src@1 = case {Data, Nullable} of {none, false} -> Src; {none, true} -> <<<<"json.nullable(_, "/utf8, Src/binary>>/binary, ")"/utf8>>; {{some, Data@1}, false} -> <<<<<>/binary, Data@1/binary>>/binary, ")"/utf8>>; {{some, Data@2}, true} -> <<<<<<<<"json.nullable("/utf8, Data@2/binary>>/binary, ", "/utf8>>/binary, Src/binary>>/binary, ")"/utf8>> end, Type_name = justin:pascal_case(Name), Type_name@1 = case Nullable of false -> Type_name; true -> <<<<"option.Option("/utf8, Type_name/binary>>/binary, ")"/utf8>> end, {ok, {out, Src@1, Type_name@1}}. -file("src/json_typedef.gleam", 960). -spec de_ref(binary(), boolean()) -> {ok, out()} | {error, codegen_error()}. de_ref(Name, Nullable) -> Src = <<(justin:snake_case(Name))/binary, "_decoder()"/utf8>>, Src@1 = case Nullable of false -> Src; true -> <<<<"decode.optional("/utf8, Src/binary>>/binary, ")"/utf8>> end, Type_name = justin:pascal_case(Name), Type_name@1 = case Nullable of false -> Type_name; true -> <<<<"option.Option("/utf8, Type_name/binary>>/binary, ")"/utf8>> end, {ok, {out, Src@1, Type_name@1}}. -file("src/json_typedef.gleam", 976). -spec pro_data_name(gleam@option:option(binary())) -> property_data_name(). pro_data_name(Name) -> case Name of none -> property_data_none; {some, N} -> {property_data_access, N} end. -file("src/json_typedef.gleam", 1217). -spec en_enum( list(binary()), boolean(), gleam@option:option(binary()), binary() ) -> {ok, out()} | {error, codegen_error()}. en_enum(Variants, Nullable, Data, Position_name) -> Type_name = Position_name, Src = <<<<"json.string(case "/utf8, (gleam@option:unwrap(Data, <<"data"/utf8>>))/binary>>/binary, " {\n"/utf8>>, Variants@1 = begin _pipe = Variants, _pipe@1 = gleam@list:map( _pipe, fun(V) -> <<<<<<<<" "/utf8, (justin:pascal_case(V))/binary>>/binary, " -> \""/utf8>>/binary, V/binary>>/binary, "\"\n"/utf8>> end ), gleam@string:concat(_pipe@1) end, Src@1 = <<<>/binary, " })"/utf8>>, Src@2 = case Nullable orelse (Data =:= none) of true -> <<<<"fn(data) { "/utf8, Src@1/binary>>/binary, " }"/utf8>>; false -> Src@1 end, Out = case Nullable of true -> Type_name@1 = <<<<"option.Option("/utf8, Type_name/binary>>/binary, ")"/utf8>>, Src@3 = case Data of {some, Data@1} -> <<<<<<<<"json.nullable("/utf8, Data@1/binary>>/binary, ", "/utf8>>/binary, Src@2/binary>>/binary, ")"/utf8>>; none -> <<<<"json.nullable(_, "/utf8, Src@2/binary>>/binary, ")"/utf8>> end, {out, Src@3, Type_name@1}; false -> {out, Src@2, Type_name} end, {ok, Out}. -file("src/json_typedef.gleam", 1394). -spec en_nullable(binary(), binary(), boolean(), gleam@option:option(binary())) -> out(). en_nullable(Src, Type_name, Nullable, Data) -> case Nullable of true -> Type_name@1 = <<<<"option.Option("/utf8, Type_name/binary>>/binary, ")"/utf8>>, Src@1 = case Data of {some, Data@1} -> <<<<<<<<"json.nullable("/utf8, Data@1/binary>>/binary, ", "/utf8>>/binary, Src/binary>>/binary, ")"/utf8>>; none -> <<<<"json.nullable(_, "/utf8, Src/binary>>/binary, ")"/utf8>> end, {out, Src@1, Type_name@1}; false -> Src@2 = case Data of {some, Data@2} -> <<<<<>/binary, Data@2/binary>>/binary, ")"/utf8>>; none -> Src end, {out, Src@2, Type_name} end. -file("src/json_typedef.gleam", 1384). -spec en_type(type(), boolean(), gleam@option:option(binary())) -> out(). en_type(T, Nullable, Data) -> {Src, Type_name} = case T of boolean -> {<<"json.bool"/utf8>>, <<"Bool"/utf8>>}; float32 -> {<<"json.float"/utf8>>, <<"Float"/utf8>>}; float64 -> {<<"json.float"/utf8>>, <<"Float"/utf8>>}; string -> {<<"json.string"/utf8>>, <<"String"/utf8>>}; timestamp -> {<<"json.string"/utf8>>, <<"String"/utf8>>}; int16 -> {<<"json.int"/utf8>>, <<"Int"/utf8>>}; int32 -> {<<"json.int"/utf8>>, <<"Int"/utf8>>}; int8 -> {<<"json.int"/utf8>>, <<"Int"/utf8>>}; uint16 -> {<<"json.int"/utf8>>, <<"Int"/utf8>>}; uint32 -> {<<"json.int"/utf8>>, <<"Int"/utf8>>}; uint8 -> {<<"json.int"/utf8>>, <<"Int"/utf8>>} end, en_nullable(Src, Type_name, Nullable, Data). -file("src/json_typedef.gleam", 1419). -spec de_nullable(binary(), binary(), boolean()) -> out(). de_nullable(Src, Type_name, Nullable) -> case Nullable of true -> Type_name@1 = <<<<"option.Option("/utf8, Type_name/binary>>/binary, ")"/utf8>>, Src@1 = <<<<"decode.optional("/utf8, Src/binary>>/binary, ")"/utf8>>, {out, Src@1, Type_name@1}; false -> {out, Src, Type_name} end. -file("src/json_typedef.gleam", 1333). -spec de_enum(list(binary()), boolean(), binary()) -> {ok, out()} | {error, codegen_error()}. de_enum(Variants, Nullable, Position_name) -> Type_name = Position_name, Src = <<"decode.then(decode.string, fn(s) { case s {\n"/utf8>>, Variants@1 = gleam@list:map( Variants, fun(V) -> <<<<<<<<" \""/utf8, V/binary>>/binary, "\" -> decode.into("/utf8>>/binary, (justin:pascal_case(V))/binary>>/binary, ")\n"/utf8>> end ), Src@1 = <>, Src@2 = <<<<< decode.fail(\""/utf8>>/binary, Type_name/binary>>/binary, "\")\n"/utf8>>, Src@3 = <>, {ok, de_nullable(Src@3, Type_name, Nullable)}. -file("src/json_typedef.gleam", 1374). -spec de_type(type(), boolean()) -> out(). de_type(T, Nullable) -> {Src, Type_name} = case T of boolean -> {<<"decode.bool"/utf8>>, <<"Bool"/utf8>>}; float32 -> {<<"decode.float"/utf8>>, <<"Float"/utf8>>}; float64 -> {<<"decode.float"/utf8>>, <<"Float"/utf8>>}; string -> {<<"decode.string"/utf8>>, <<"String"/utf8>>}; timestamp -> {<<"decode.string"/utf8>>, <<"String"/utf8>>}; int16 -> {<<"decode.int"/utf8>>, <<"Int"/utf8>>}; int32 -> {<<"decode.int"/utf8>>, <<"Int"/utf8>>}; int8 -> {<<"decode.int"/utf8>>, <<"Int"/utf8>>}; uint16 -> {<<"decode.int"/utf8>>, <<"Int"/utf8>>}; uint32 -> {<<"decode.int"/utf8>>, <<"Int"/utf8>>}; uint8 -> {<<"decode.int"/utf8>>, <<"Int"/utf8>>} end, de_nullable(Src, Type_name, Nullable). -file("src/json_typedef.gleam", 1103). -spec en_properties_schema( properties_schema(), boolean(), property_data_name(), binary(), gleam@option:option({binary(), binary()}) ) -> {ok, out()} | {error, codegen_error()}. en_properties_schema(Schema, Nullable, Data, Name, Extra) -> {properties_schema, Properties, Optional_properties, _} = Schema, Property_data = fun(Field_name) -> Field_name@1 = justin:snake_case(Field_name), case Data of property_data_direct -> Field_name@1; {property_data_access, Name@1} when not Nullable -> <<<>/binary, Field_name@1/binary>>; _ -> <<"data."/utf8, Field_name@1/binary>> end end, gleam@result:'try'( gleam@list:try_map( Properties, fun(P) -> Name@2 = <>, Data@1 = Property_data(erlang:element(1, P)), gleam@result:map( en_schema(erlang:element(2, P), {some, Data@1}, Name@2), fun(Out) -> {erlang:element(1, P), erlang:element(2, Out)} end ) end ), fun(Properties@1) -> Properties@2 = begin _pipe = case Extra of none -> Properties@1; {some, {K, V}} -> [{K, <<<<"json.string(\""/utf8, V/binary>>/binary, "\")"/utf8>>} | Properties@1] end, gleam@list:map( _pipe, fun(P@1) -> <<<<<<<<"\n #(\""/utf8, (erlang:element(1, P@1))/binary>>/binary, "\", "/utf8>>/binary, (erlang:element(2, P@1))/binary>>/binary, "),"/utf8>> end ) end, gleam@result:map( gleam@list:try_map( Optional_properties, fun(P@2) -> N = <>, D = Property_data(erlang:element(1, P@2)), gleam@result:map( en_schema(erlang:element(2, P@2), none, Name), fun(_use0) -> {out, S, _} = _use0, <<<<<<<<<<<<" |> helper__optional_property("/utf8, D/binary>>/binary, ", \""/utf8>>/binary, N/binary>>/binary, "\", "/utf8>>/binary, S/binary>>/binary, ")"/utf8>> end ) end ), fun(Optionals) -> Src = case Properties@2 of [] -> <<"[]"/utf8>>; P@3 -> <<<<"["/utf8, (gleam@string:concat(P@3))/binary>>/binary, "\n ]"/utf8>> end, Src@1 = case Optional_properties of [] -> <<<<"json.object("/utf8, Src/binary>>/binary, ")"/utf8>>; _ -> <<<<<>/binary, (gleam@string:join(Optionals, <<"\n"/utf8>>))/binary>>/binary, "\n |> json.object"/utf8>> end, Src@2 = case Nullable of true -> Data@2 = case Data of {property_data_access, Name@3} -> Name@3; property_data_direct -> <<"data"/utf8>>; property_data_none -> <<"data"/utf8>> end, <<<<<<<<"case "/utf8, Data@2/binary>>/binary, " { option.Some(data) -> "/utf8>>/binary, Src@1/binary>>/binary, " option.None -> json.null() }"/utf8>>; false -> Src@1 end, Src@3 = case Data of property_data_none -> <<<<"fn(data) { "/utf8, Src@2/binary>>/binary, " }"/utf8>>; _ -> Src@2 end, Type_name = case Nullable of true -> <<<<"option.Option("/utf8, Name/binary>>/binary, ")"/utf8>>; false -> Name end, {out, Src@3, Type_name} end ) end ). -file("src/json_typedef.gleam", 916). -spec en_schema(schema(), gleam@option:option(binary()), binary()) -> {ok, out()} | {error, codegen_error()}. en_schema(Schema, Data, Name) -> case Schema of {discriminator, Nullable, _, Tag, Mapping} -> en_discriminator(Mapping, Tag, Nullable, Data, Name); {elements, Nullable@1, _, Schema@1} -> en_elements( Schema@1, Nullable@1, Data, <> ); empty -> {error, cannot_convert_empty_to_json_error}; {enum, Nullable@2, _, Variants} -> en_enum(Variants, Nullable@2, Data, Name); {properties, Nullable@3, _, Schema@2} -> en_properties_schema( Schema@2, Nullable@3, pro_data_name(Data), Name, none ); {ref, Nullable@4, _, Name@1} -> en_ref(Name@1, Data, Nullable@4); {type, Nullable@5, _, Type_} -> {ok, en_type(Type_, Nullable@5, Data)}; {values, Nullable@6, _, Schema@3} -> en_values(Schema@3, Nullable@6, Data, Name) end. -file("src/json_typedef.gleam", 782). -spec gen_add_encoder(generator(), binary(), schema()) -> {ok, generator()} | {error, codegen_error()}. gen_add_encoder(Gen, Name, Schema) -> gleam@result:'try'( en_schema(Schema, {some, <<"data"/utf8>>}, Name), fun(Out) -> Name@1 = <<(justin:snake_case(Name))/binary, "_to_json"/utf8>>, Src = <<<<<<<<<<<<"pub fn "/utf8, Name@1/binary>>/binary, "(data: "/utf8>>/binary, (erlang:element(3, Out))/binary>>/binary, ") -> json.Json { "/utf8>>/binary, (erlang:element(2, Out))/binary>>/binary, " }"/utf8>>, gen_add_function(Gen, Name@1, Src) end ). -file("src/json_typedef.gleam", 541). -spec gen_encoders(generator(), binary(), root_schema()) -> {ok, generator()} | {error, codegen_error()}. gen_encoders(Gen, Root, Schema) -> gen_add_encoder(Gen, Root, erlang:element(3, Schema)). -file("src/json_typedef.gleam", 1039). -spec en_discriminator( list({binary(), properties_schema()}), binary(), boolean(), gleam@option:option(binary()), binary() ) -> {ok, out()} | {error, codegen_error()}. en_discriminator(Mapping, Tag, Nullable, Data, Name) -> gleam@result:'try'( gleam@list:try_map( Mapping, fun(Pair) -> Name@1 = <>, Result = en_properties_schema( erlang:element(2, Pair), false, property_data_direct, Name@1, {some, {Tag, erlang:element(1, Pair)}} ), Props = lists:append( gleam@list:map( erlang:element(2, (erlang:element(2, Pair))), fun(P) -> erlang:element(1, P) end ), gleam@list:map( erlang:element(3, (erlang:element(2, Pair))), fun(P@1) -> erlang:element(1, P@1) end ) ), gleam@result:map( Result, fun(_use0) -> {out, Src, _} = _use0, {erlang:element(1, Pair), Src, gleam@list:sort(Props, fun gleam@string:compare/2)} end ) end ), fun(Properties) -> Clauses = gleam@list:map( Properties, fun(Pair@1) -> Name@2 = <>, Args = case erlang:element(3, Pair@1) of [] -> <<""/utf8>>; A -> <<<<"("/utf8, (gleam@string:join(A, <<":, "/utf8>>))/binary>>/binary, ":)"/utf8>> end, <<<<<<<<" "/utf8, Name@2/binary>>/binary, Args/binary>>/binary, " -> "/utf8>>/binary, (erlang:element(2, Pair@1))/binary>> end ), Src@1 = <<<<<<<<"case "/utf8, (gleam@option:unwrap(Data, <<"data"/utf8>>))/binary>>/binary, " {\n"/utf8>>/binary, (gleam@string:join(Clauses, <<"\n"/utf8>>))/binary>>/binary, "\n }"/utf8>>, Out = case Nullable of true -> Type_name = <<<<"option.Option("/utf8, Name/binary>>/binary, ")"/utf8>>, Data@1 = gleam@option:unwrap(Data, <<"data"/utf8>>), Src@2 = <<<<<<<<"case "/utf8, Data@1/binary>>/binary, " { option.Some(data) -> "/utf8>>/binary, Src@1/binary>>/binary, " option.None -> json.null() }"/utf8>>, {out, Src@2, Type_name}; false -> {out, Src@1, Name} end, case Data of none -> {ok, begin _record = Out, {out, <<<<"fn(data) { "/utf8, (erlang:element(2, Out))/binary>>/binary, " }"/utf8>>, erlang:element(3, _record)} end}; {some, _} -> {ok, Out} end end ). -file("src/json_typedef.gleam", 1194). -spec en_values(schema(), boolean(), gleam@option:option(binary()), binary()) -> {ok, out()} | {error, codegen_error()}. en_values(Schema, Nullable, Data, Position_name) -> gleam@result:map( en_schema(Schema, none, Position_name), fun(_use0) -> {out, Src, Type_name} = _use0, Type_name@1 = <<<<"dict.Dict(String, "/utf8, Type_name/binary>>/binary, ")"/utf8>>, Data@1 = gleam@option:unwrap(Data, <<"_"/utf8>>), case Nullable of false -> Src@1 = <<<<<<<<"helper__dict_to_json("/utf8, Data@1/binary>>/binary, ", "/utf8>>/binary, Src/binary>>/binary, ")"/utf8>>, {out, Src@1, Type_name@1}; true -> Type_name@2 = <<<<"option.Option("/utf8, Type_name@1/binary>>/binary, ")"/utf8>>, Src@2 = <<<<"helper__dict_to_json(_, "/utf8, Src/binary>>/binary, ")"/utf8>>, Src@3 = <<<<<<<<"json.nullable("/utf8, Data@1/binary>>/binary, ", "/utf8>>/binary, Src@2/binary>>/binary, ")"/utf8>>, {out, Src@3, Type_name@2} end end ). -file("src/json_typedef.gleam", 1310). -spec en_elements(schema(), boolean(), gleam@option:option(binary()), binary()) -> {ok, out()} | {error, codegen_error()}. en_elements(Schema, Nullable, Data, Position_name) -> gleam@result:map( en_schema(Schema, none, Position_name), fun(_use0) -> {out, Src, Type_name} = _use0, Type_name@1 = <<<<"List("/utf8, Type_name/binary>>/binary, ")"/utf8>>, Data@1 = gleam@option:unwrap(Data, <<"_"/utf8>>), case Nullable of false -> Src@1 = <<<<<<<<"json.array("/utf8, Data@1/binary>>/binary, ", "/utf8>>/binary, Src/binary>>/binary, ")"/utf8>>, {out, Src@1, Type_name@1}; true -> Type_name@2 = <<<<"option.Option("/utf8, Type_name@1/binary>>/binary, ")"/utf8>>, Src@2 = <<<<"json.array(_, "/utf8, Src/binary>>/binary, ")"/utf8>>, Src@3 = <<<<<<<<"json.nullable("/utf8, Data@1/binary>>/binary, ", "/utf8>>/binary, Src@2/binary>>/binary, ")"/utf8>>, {out, Src@3, Type_name@2} end end ). -file("src/json_typedef.gleam", 1252). -spec de_properties_schema(properties_schema(), boolean(), binary()) -> {ok, out()} | {error, codegen_error()}. de_properties_schema(Schema, Nullable, Name) -> {properties_schema, Properties, Optional_properties, _} = Schema, Properties@1 = begin _pipe = lists:append( gleam@list:map( Properties, fun(P) -> {erlang:element(1, P), erlang:element(2, P), false} end ), gleam@list:map( Optional_properties, fun(P@1) -> {erlang:element(1, P@1), erlang:element(2, P@1), true} end ) ), gleam@list:sort( _pipe, fun(A, B) -> gleam@string:compare(erlang:element(1, A), erlang:element(1, B)) end ) end, gleam@result:'try'( gleam@list:try_map( Properties@1, fun(Prop) -> gleam@result:map( de_schema( erlang:element(2, Prop), <> ), fun(S) -> {erlang:element(1, Prop), S, erlang:element(3, Prop)} end ) end ), fun(Properties@2) -> Params = begin _pipe@1 = Properties@2, _pipe@2 = gleam@list:map( _pipe@1, fun(N) -> Name@1 = justin:snake_case(erlang:element(1, N)), <<<<" use "/utf8, Name@1/binary>>/binary, " <- decode.parameter"/utf8>> end ), gleam@string:join(_pipe@2, <<"\n"/utf8>>) end, Fields = begin _pipe@3 = Properties@2, _pipe@4 = gleam@list:map( _pipe@3, fun(P@2) -> Field = case erlang:element(3, P@2) of true -> <<" |> decode.optional_field(\""/utf8>>; false -> <<" |> decode.field(\""/utf8>> end, <<<<<<<>/binary, "\", "/utf8>>/binary, (erlang:element(2, (erlang:element(2, P@2))))/binary>>/binary, ")"/utf8>> end ), gleam@string:join(_pipe@4, <<"\n"/utf8>>) end, Keys = begin _pipe@5 = Properties@2, _pipe@6 = gleam@list:map( _pipe@5, fun(N@1) -> <<(justin:snake_case(erlang:element(1, N@1)))/binary, ":"/utf8>> end ), gleam@string:join(_pipe@6, <<", "/utf8>>) end, Src = <<<<<<<<<<<<<<"decode.into({ "/utf8, Params/binary>>/binary, " "/utf8>>/binary, Name/binary>>/binary, "("/utf8>>/binary, Keys/binary>>/binary, ") }) "/utf8>>/binary, Fields/binary>>, {ok, de_nullable(Src, Name, Nullable)} end ). -file("src/json_typedef.gleam", 983). -spec de_schema(schema(), binary()) -> {ok, out()} | {error, codegen_error()}. de_schema(Schema, Name) -> case Schema of {discriminator, Nullable, _, Tag, Mapping} -> de_discriminator(Mapping, Tag, Nullable, Name); {elements, Nullable@1, _, Schema@1} -> de_elements(Schema@1, Nullable@1, <>); empty -> {ok, {out, <<"decode.dynamic"/utf8>>, <<"dynamic.Dynamic"/utf8>>}}; {enum, Nullable@2, _, Variants} -> de_enum(Variants, Nullable@2, Name); {properties, Nullable@3, _, Schema@2} -> de_properties_schema(Schema@2, Nullable@3, Name); {ref, Nullable@4, _, Name@1} -> de_ref(Name@1, Nullable@4); {type, Nullable@5, _, Type_} -> {ok, de_type(Type_, Nullable@5)}; {values, Nullable@6, _, Schema@3} -> de_values(Schema@3, Nullable@6, Name) end. -file("src/json_typedef.gleam", 796). -spec gen_add_decoder(generator(), binary(), schema()) -> {ok, generator()} | {error, codegen_error()}. gen_add_decoder(Gen, Name, Schema) -> gleam@result:'try'( de_schema(Schema, Name), fun(Out) -> Fn_name = <<(justin:snake_case(Name))/binary, "_decoder"/utf8>>, Src = <<<<<<<<<<<<"pub fn "/utf8, Fn_name/binary>>/binary, "() -> decode.Decoder("/utf8>>/binary, (erlang:element(3, Out))/binary>>/binary, ") { "/utf8>>/binary, (erlang:element(2, Out))/binary>>/binary, " }"/utf8>>, gen_add_function(Gen, Name, Src) end ). -file("src/json_typedef.gleam", 549). -spec gen_decoders(generator(), binary(), root_schema()) -> {ok, generator()} | {error, codegen_error()}. gen_decoders(Gen, Root, Schema) -> gen_add_decoder(Gen, Root, erlang:element(3, Schema)). -file("src/json_typedef.gleam", 999). -spec de_discriminator( list({binary(), properties_schema()}), binary(), boolean(), binary() ) -> {ok, out()} | {error, codegen_error()}. de_discriminator(Mapping, Tag, Nullable, Name) -> gleam@result:'try'( gleam@list:try_map( Mapping, fun(Pair) -> Result = de_properties_schema( erlang:element(2, Pair), false, <> ), gleam@result:map( Result, fun(Out) -> {erlang:element(1, Pair), erlang:element(2, Out)} end ) end ), fun(Mapping@1) -> Clauses = gleam@list:map( Mapping@1, fun(Pair@1) -> <<<<<<" \""/utf8, (erlang:element(1, Pair@1))/binary>>/binary, "\" -> "/utf8>>/binary, (erlang:element(2, Pair@1))/binary>> end ), Src = <<<<<<<<<<<<"decode.at([\""/utf8, Tag/binary>>/binary, "\"], decode.string) |> decode.then(fn(tag) { case tag { "/utf8>>/binary, (gleam@string:join(Clauses, <<"\n"/utf8>>))/binary>>/binary, " _ -> decode.fail(\""/utf8>>/binary, Name/binary>>/binary, "\") } })"/utf8>>, Type_name = case Nullable of false -> Name; true -> <<<<"option.Option("/utf8, Name/binary>>/binary, ")"/utf8>> end, {ok, {out, Src, Type_name}} end ). -file("src/json_typedef.gleam", 1352). -spec de_values(schema(), boolean(), binary()) -> {ok, out()} | {error, codegen_error()}. de_values(Schema, Nullable, Position_name) -> gleam@result:map( de_schema(Schema, Position_name), fun(_use0) -> {out, Src, Type_name} = _use0, Type_name@1 = <<<<"dict.Dict(String, "/utf8, Type_name/binary>>/binary, ")"/utf8>>, Src@1 = <<<<"decode.dict(decode.string, "/utf8, Src/binary>>/binary, ")"/utf8>>, de_nullable(Src@1, Type_name@1, Nullable) end ). -file("src/json_typedef.gleam", 1363). -spec de_elements(schema(), boolean(), binary()) -> {ok, out()} | {error, codegen_error()}. de_elements(Schema, Nullable, Position_name) -> gleam@result:map( de_schema(Schema, Position_name), fun(_use0) -> {out, Src, Type_name} = _use0, Type_name@1 = <<<<"List("/utf8, Type_name/binary>>/binary, ")"/utf8>>, Src@1 = <<<<"decode.list("/utf8, Src/binary>>/binary, ")"/utf8>>, de_nullable(Src@1, Type_name@1, Nullable) end ). -file("src/json_typedef.gleam", 699). -spec type_variant(generator(), binary(), properties_schema()) -> {ok, {generator(), binary()}} | {error, codegen_error()}. type_variant(Gen, Name, Schema) -> Gen@1 = case erlang:element(3, Schema) of [] -> Gen; _ -> _record = Gen, {generator, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), true, erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)} end, {properties_schema, Properties, Optional_properties, _} = Schema, gleam@result:'try'( gleam@list:try_fold( Properties, Gen@1, fun(Gen@2, Prop) -> gen_type( Gen@2, <>, erlang:element(2, Prop) ) end ), fun(Gen@3) -> gleam@result:'try'( gleam@list:try_fold( Optional_properties, Gen@3, fun(Gen@4, Prop@1) -> Gen@5 = begin _record@1 = Gen@4, {generator, erlang:element(2, _record@1), erlang:element(3, _record@1), erlang:element(4, _record@1), true, erlang:element(6, _record@1), erlang:element(7, _record@1), erlang:element(8, _record@1), erlang:element(9, _record@1), erlang:element(10, _record@1), erlang:element(11, _record@1)} end, gen_type( Gen@5, <>, erlang:element(2, Prop@1) ) end ), fun(Gen@6) -> Properties@1 = begin _pipe = lists:append( gleam@list:map( Properties, fun(P) -> {erlang:element(1, P), erlang:element(2, P), false} end ), gleam@list:map( Optional_properties, fun(P@1) -> {erlang:element(1, P@1), erlang:element(2, P@1), true} end ) ), _pipe@1 = gleam@list:sort( _pipe, fun(A, B) -> gleam@string:compare( erlang:element(1, A), erlang:element(1, B) ) end ), _pipe@2 = gleam@list:map( _pipe@1, fun(P@2) -> N = justin:snake_case(erlang:element(1, P@2)), <<<<<<" "/utf8, N/binary>>/binary, ": "/utf8>>/binary, (type_name( erlang:element(2, P@2), <> ))/binary>> end ), gleam@string:join(_pipe@2, <<",\n"/utf8>>) end, gleam@result:'try'( ensure_constructor_unique(Gen@6, Name), fun(Gen@7) -> Src = <<<<<<<<" "/utf8, Name/binary>>/binary, "( "/utf8>>/binary, Properties@1/binary>>/binary, ", )"/utf8>>, {ok, {Gen@7, Src}} end ) end ) end ). -file("src/json_typedef.gleam", 557). -spec gen_type(generator(), binary(), schema()) -> {ok, generator()} | {error, codegen_error()}. gen_type(Gen, Name, Schema) -> Name@1 = justin:pascal_case(Name), case Schema of empty -> {ok, begin _record = Gen, {generator, erlang:element(2, _record), erlang:element(3, _record), true, erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)} end}; {ref, Nullable, _, _} -> {ok, gen_register_nullable(Gen, Nullable)}; {type, Nullable@1, _, _} -> {ok, gen_register_nullable(Gen, Nullable@1)}; {enum, Nullable@2, _, Variants} -> Gen@1 = gen_register_nullable(Gen, Nullable@2), gen_enum_type(Gen@1, Name@1, Variants); {properties, Nullable@3, _, Schema@1} -> Gen@2 = gen_register_nullable(Gen, Nullable@3), gen_register_properties(Gen@2, Name@1, Schema@1); {elements, Nullable@4, _, Schema@2} -> Gen@3 = gen_register_nullable(Gen, Nullable@4), gen_type(Gen@3, <>, Schema@2); {values, Nullable@5, _, Schema@3} -> Gen@4 = gen_register_nullable(Gen, Nullable@5), Gen@5 = begin _record@1 = Gen@4, {generator, erlang:element(2, _record@1), erlang:element(3, _record@1), erlang:element(4, _record@1), erlang:element(5, _record@1), true, erlang:element(7, _record@1), erlang:element(8, _record@1), erlang:element(9, _record@1), erlang:element(10, _record@1), erlang:element(11, _record@1)} end, gen_type(Gen@5, <>, Schema@3); {discriminator, Nullable@6, _, Tag, Mapping} -> Gen@6 = gen_register_nullable(Gen, Nullable@6), gen_register_discriminator(Gen@6, Tag, Name@1, Mapping) end. -file("src/json_typedef.gleam", 658). -spec gen_register_properties(generator(), binary(), properties_schema()) -> {ok, generator()} | {error, codegen_error()}. gen_register_properties(Gen, Name, Schema) -> gleam@result:'try'( ensure_no_duplicate_properties(Schema, none, Name, Name), fun(_) -> gleam@result:'try'( type_variant(Gen, Name, Schema), fun(_use0) -> {Gen@1, Src} = _use0, Src@1 = <<<<<<<<"pub type "/utf8, Name/binary>>/binary, " { "/utf8>>/binary, Src/binary>>/binary, " }"/utf8>>, Type_name = Name, gen_add_type(Gen@1, Type_name, Src@1) end ) end ). -file("src/json_typedef.gleam", 528). -spec gen_types(generator(), binary(), root_schema()) -> {ok, generator()} | {error, codegen_error()}. gen_types(Gen, Root, Schema) -> gleam@result:'try'( gleam@list:try_fold( erlang:element(2, Schema), Gen, fun(Gen@1, Def) -> gen_type(Gen@1, erlang:element(1, Def), erlang:element(2, Def)) end ), fun(Gen@2) -> gen_type(Gen@2, Root, erlang:element(3, Schema)) end ). -file("src/json_typedef.gleam", 507). -spec generate(generator(), root_schema()) -> {ok, binary()} | {error, codegen_error()}. generate(Gen, Schema) -> Root = justin:pascal_case(erlang:element(10, Gen)), gleam@result:'try'( gen_types(Gen, Root, Schema), fun(Gen@1) -> gleam@result:'try'(case erlang:element(2, Gen@1) of true -> gen_decoders(Gen@1, Root, Schema); false -> {ok, Gen@1} end, fun(Gen@2) -> gleam@result:map(case erlang:element(3, Gen@2) of true -> gen_encoders(Gen@2, Root, Schema); false -> {ok, Gen@2} end, fun(Gen@3) -> gen_to_string(Gen@3) end) end) end ). -file("src/json_typedef.gleam", 632). -spec gen_register_discriminator( generator(), binary(), binary(), list({binary(), properties_schema()}) ) -> {ok, generator()} | {error, codegen_error()}. gen_register_discriminator(Gen, Tag, Name, Mapping) -> Type_name = Name, gleam@result:'try'( gleam@list:try_fold( Mapping, {Gen, []}, fun(Pair, Mapping@1) -> Name@1 = <>, Result = ensure_no_duplicate_properties( erlang:element(2, Mapping@1), {some, Tag}, Type_name, Name@1 ), gleam@result:'try'( Result, fun(_) -> Result@1 = type_variant( erlang:element(1, Pair), Name@1, erlang:element(2, Mapping@1) ), gleam@result:map( Result@1, fun(_use0) -> {Gen@1, Src} = _use0, {Gen@1, [Src | erlang:element(2, Pair)]} end ) end ) end ), fun(_use0@1) -> {Gen@2, Src@1} = _use0@1, Src@2 = <<<<<<<<"pub type "/utf8, Name/binary>>/binary, " { "/utf8>>/binary, (gleam@string:join(Src@1, <<"\n"/utf8>>))/binary>>/binary, " }"/utf8>>, Type_name@1 = Name, gen_add_type(Gen@2, Type_name@1, Src@2) end ). -file("src/json_typedef.gleam", 279). -spec decode_properties_schema(gleam@dynamic:dynamic_()) -> {ok, properties_schema()} | {error, list(gleam@dynamic:decode_error())}. decode_properties_schema(Data) -> Field = fun(Name, Data@1) -> case (gleam@dynamic:field(Name, fun gleam@dynamic:dynamic/1))(Data@1) of {ok, D} -> _pipe = decode_object_as_list(D, fun decode_schema/1), push_path(_pipe, Name); {error, _} -> {ok, []} end end, (gleam@dynamic:decode3( fun(Field@0, Field@1, Field@2) -> {properties_schema, Field@0, Field@1, Field@2} end, fun(_capture) -> Field(<<"properties"/utf8>>, _capture) end, fun(_capture@1) -> Field(<<"optionalProperties"/utf8>>, _capture@1) end, fun(D@1) -> case (gleam@dynamic:field( <<"additionalProperties"/utf8>>, fun gleam@dynamic:dynamic/1 ))(D@1) of {ok, D@2} -> _pipe@1 = gleam@dynamic:bool(D@2), push_path(_pipe@1, <<"additionalProperties"/utf8>>); {error, _} -> {ok, false} end end ))(Data). -file("src/json_typedef.gleam", 205). -spec decode_schema(gleam@dynamic:dynamic_()) -> {ok, schema()} | {error, list(gleam@dynamic:decode_error())}. decode_schema(Data) -> gleam@result:'try'( (gleam@dynamic:dict( fun gleam@dynamic:string/1, fun gleam@dynamic:dynamic/1 ))(Data), fun(Data@1) -> Decoder = begin _pipe = key_decoder(Data@1, <<"type"/utf8>>, fun decode_type/2), _pipe@1 = gleam@result:lazy_or( _pipe, fun() -> key_decoder(Data@1, <<"enum"/utf8>>, fun decode_enum/2) end ), _pipe@2 = gleam@result:lazy_or( _pipe@1, fun() -> key_decoder(Data@1, <<"ref"/utf8>>, fun decode_ref/2) end ), _pipe@3 = gleam@result:lazy_or( _pipe@2, fun() -> key_decoder( Data@1, <<"values"/utf8>>, fun decode_values/2 ) end ), _pipe@4 = gleam@result:lazy_or( _pipe@3, fun() -> key_decoder( Data@1, <<"elements"/utf8>>, fun decode_elements/2 ) end ), _pipe@5 = gleam@result:lazy_or( _pipe@4, fun() -> key_decoder( Data@1, <<"discriminator"/utf8>>, fun decode_discriminator/2 ) end ), _pipe@6 = gleam@result:lazy_or( _pipe@5, fun() -> key_decoder( Data@1, <<"properties"/utf8>>, fun decode_properties/2 ) end ), _pipe@7 = gleam@result:lazy_or( _pipe@6, fun() -> key_decoder( Data@1, <<"extraProperties"/utf8>>, fun decode_properties/2 ) end ), _pipe@8 = gleam@result:lazy_or( _pipe@7, fun() -> key_decoder( Data@1, <<"additionalProperties"/utf8>>, fun decode_properties/2 ) end ), gleam@result:unwrap(_pipe@8, fun() -> decode_empty(Data@1) end) end, Decoder() end ). -file("src/json_typedef.gleam", 242). -spec decode_discriminator( gleam@dynamic:dynamic_(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, schema()} | {error, list(gleam@dynamic:decode_error())}. decode_discriminator(Tag, Data) -> gleam@result:'try'( get_nullable(Data), fun(Nullable) -> gleam@result:'try'( get_metadata(Data), fun(Metadata) -> gleam@result:'try'( begin _pipe = gleam@dynamic:string(Tag), push_path(_pipe, <<"discriminator"/utf8>>) end, fun(Tag@1) -> gleam@result:'try'( case gleam_stdlib:map_get( Data, <<"mapping"/utf8>> ) of {ok, Mapping} -> {ok, Mapping}; {error, _} -> {error, [{decode_error, <<"field"/utf8>>, <<"nothing"/utf8>>, [<<"mapping"/utf8>>]}]} end, fun(Mapping@1) -> gleam@result:'try'( begin _pipe@1 = decode_object_as_list( Mapping@1, fun decode_properties_schema/1 ), push_path( _pipe@1, <<"mapping"/utf8>> ) end, fun(Properties) -> {ok, {discriminator, Nullable, Metadata, Tag@1, Properties}} end ) end ) end ) end ) end ). -file("src/json_typedef.gleam", 201). -spec decoder(gleam@dynamic:dynamic_()) -> {ok, root_schema()} | {error, list(gleam@dynamic:decode_error())}. decoder(Data) -> (gleam@dynamic:decode2( fun(Field@0, Field@1) -> {root_schema, Field@0, Field@1} end, fun(_) -> {ok, []} end, fun decode_schema/1 ))(Data). -file("src/json_typedef.gleam", 268). -spec decode_properties( gleam@dynamic:dynamic_(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, schema()} | {error, list(gleam@dynamic:decode_error())}. decode_properties(_, Data) -> gleam@result:'try'( get_nullable(Data), fun(Nullable) -> gleam@result:'try'( get_metadata(Data), fun(Metadata) -> _pipe = gleam_stdlib:identity(Data), _pipe@1 = decode_properties_schema(_pipe), gleam@result:map( _pipe@1, fun(_capture) -> {properties, Nullable, Metadata, _capture} end ) end ) end ). -file("src/json_typedef.gleam", 356). -spec decode_values( gleam@dynamic:dynamic_(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, schema()} | {error, list(gleam@dynamic:decode_error())}. decode_values(Values, Data) -> gleam@result:'try'( get_nullable(Data), fun(Nullable) -> gleam@result:'try'( get_metadata(Data), fun(Metadata) -> _pipe = decode_schema(Values), _pipe@1 = push_path(_pipe, <<"values"/utf8>>), gleam@result:map( _pipe@1, fun(_capture) -> {values, Nullable, Metadata, _capture} end ) end ) end ). -file("src/json_typedef.gleam", 367). -spec decode_elements( gleam@dynamic:dynamic_(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, schema()} | {error, list(gleam@dynamic:decode_error())}. decode_elements(Elements, Data) -> gleam@result:'try'( get_nullable(Data), fun(Nullable) -> gleam@result:'try'( get_metadata(Data), fun(Metadata) -> _pipe = decode_schema(Elements), _pipe@1 = push_path(_pipe, <<"elements"/utf8>>), gleam@result:map( _pipe@1, fun(_capture) -> {elements, Nullable, Metadata, _capture} end ) end ) end ). -file("src/json_typedef.gleam", 106). -spec properties_schema_to_json(properties_schema()) -> list({binary(), gleam@json:json()}). properties_schema_to_json(Schema) -> Props_json = fun(Props) -> gleam@json:object( gleam@list:map( Props, fun(Property) -> {erlang:element(1, Property), gleam@json:object( schema_to_json(erlang:element(2, Property)) )} end ) ) end, {properties_schema, Properties, Optional_properties, Additional_properties} = Schema, Data = [], Data@1 = case Additional_properties of false -> Data; _ -> [{<<"additionalProperties"/utf8>>, gleam@json:bool(true)} | Data] end, Data@2 = case Optional_properties of [] -> Data@1; P -> [{<<"optionalProperties"/utf8>>, Props_json(P)} | Data@1] end, Data@3 = case Properties of [] -> Data@2; P@1 -> [{<<"properties"/utf8>>, Props_json(P@1)} | Data@2] end, Data@3. -file("src/json_typedef.gleam", 141). -spec schema_to_json(schema()) -> list({binary(), gleam@json:json()}). schema_to_json(Schema) -> case Schema of empty -> []; {ref, Nullable, Metadata, Name} -> _pipe = [{<<"values"/utf8>>, gleam@json:string(Name)}], _pipe@1 = add_nullable(_pipe, Nullable), add_metadata(_pipe@1, Metadata); {type, Nullable@1, Metadata@1, Type_} -> _pipe@2 = [{<<"type"/utf8>>, type_to_json(Type_)}], _pipe@3 = add_nullable(_pipe@2, Nullable@1), add_metadata(_pipe@3, Metadata@1); {enum, Nullable@2, Metadata@2, Variants} -> _pipe@4 = [{<<"enum"/utf8>>, gleam@json:array(Variants, fun gleam@json:string/1)}], _pipe@5 = add_nullable(_pipe@4, Nullable@2), add_metadata(_pipe@5, Metadata@2); {values, Nullable@3, Metadata@3, Schema@1} -> _pipe@6 = [{<<"values"/utf8>>, gleam@json:object(schema_to_json(Schema@1))}], _pipe@7 = add_nullable(_pipe@6, Nullable@3), add_metadata(_pipe@7, Metadata@3); {elements, Nullable@4, Metadata@4, Schema@2} -> _pipe@8 = [{<<"elements"/utf8>>, gleam@json:object(schema_to_json(Schema@2))}], _pipe@9 = add_nullable(_pipe@8, Nullable@4), add_metadata(_pipe@9, Metadata@4); {properties, Nullable@5, Metadata@5, Schema@3} -> _pipe@10 = properties_schema_to_json(Schema@3), _pipe@11 = add_nullable(_pipe@10, Nullable@5), add_metadata(_pipe@11, Metadata@5); {discriminator, Nullable@6, _, Tag, Mapping} -> _pipe@12 = discriminator_to_json(Tag, Mapping), add_nullable(_pipe@12, Nullable@6) end. -file("src/json_typedef.gleam", 90). -spec to_json(root_schema()) -> gleam@json:json(). to_json(Schema) -> Properties = schema_to_json(erlang:element(3, Schema)), Properties@1 = case erlang:element(2, Schema) of [] -> Properties; Definitions -> Definitions@1 = gleam@list:map( Definitions, fun(Definition) -> {erlang:element(1, Definition), gleam@json:object( schema_to_json(erlang:element(2, Definition)) )} end ), [{<<"definitions"/utf8>>, gleam@json:object(Definitions@1)} | Properties] end, gleam@json:object(Properties@1). -file("src/json_typedef.gleam", 190). -spec discriminator_to_json(binary(), list({binary(), properties_schema()})) -> list({binary(), gleam@json:json()}). discriminator_to_json(Tag, Mapping) -> Mapping@1 = gleam@list:map( Mapping, fun(Variant) -> {erlang:element(1, Variant), gleam@json:object( properties_schema_to_json(erlang:element(2, Variant)) )} end ), [{<<"discriminator"/utf8>>, gleam@json:string(Tag)}, {<<"mapping"/utf8>>, gleam@json:object(Mapping@1)}].