Current section
Files
Jump to
Current section
Files
src/protozoa@internal@codegen@decoders.erl
-module(protozoa@internal@codegen@decoders).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/protozoa/internal/codegen/decoders.gleam").
-export([generate_message_decoder_with_registry/3, generate_decoders_with_registry/3]).
-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(false).
-file("src/protozoa/internal/codegen/decoders.gleam", 135).
?DOC(false).
-spec generate_map_field_decoder(protozoa@parser:proto_type(), binary()) -> binary().
generate_map_field_decoder(Proto_type, Field_num) ->
case Proto_type of
string ->
<<<<"decode.string_with_default("/utf8, Field_num/binary>>/binary,
", \"\")"/utf8>>;
int32 ->
<<<<"decode.int32_with_default("/utf8, Field_num/binary>>/binary,
", 0)"/utf8>>;
bool ->
<<<<"decode.bool_with_default("/utf8, Field_num/binary>>/binary,
", False)"/utf8>>;
{message_type, <<"Value"/utf8>>} ->
<<<<"decode.nested_message("/utf8, Field_num/binary>>/binary,
", value_decoder())"/utf8>>;
{message_type, Name} ->
Decoder_name = <<(string:lowercase(
protozoa@internal@codegen@types:flatten_type_name(Name)
))/binary,
"_decoder"/utf8>>,
<<<<<<<<"decode.nested_message("/utf8, Field_num/binary>>/binary,
", "/utf8>>/binary,
Decoder_name/binary>>/binary,
"())"/utf8>>;
_ ->
<<<<"decode.string_with_default("/utf8, Field_num/binary>>/binary,
", \"\")"/utf8>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 154).
?DOC(false).
-spec get_gleam_type(protozoa@parser:proto_type()) -> binary().
get_gleam_type(Proto_type) ->
case Proto_type of
string ->
<<"String"/utf8>>;
int32 ->
<<"Int"/utf8>>;
bool ->
<<"Bool"/utf8>>;
{message_type, <<"Value"/utf8>>} ->
<<"Value"/utf8>>;
{message_type, Name} ->
protozoa@internal@codegen@types:flatten_type_name(Name);
_ ->
<<"String"/utf8>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 101).
?DOC(false).
-spec generate_map_entry_decoder(
binary(),
protozoa@parser:proto_type(),
protozoa@parser:proto_type()
) -> binary().
generate_map_entry_decoder(Field_num, Key_type, Value_type) ->
Function_name = <<<<"map_entry_"/utf8, Field_num/binary>>/binary,
"_decoder"/utf8>>,
Key_decoder = generate_map_field_decoder(Key_type, <<"1"/utf8>>),
Value_decoder = generate_map_field_decoder(Value_type, <<"2"/utf8>>),
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"fn "/utf8,
Function_name/binary>>/binary,
"() -> fn(decode.Field) -> Result(#("/utf8>>/binary,
(get_gleam_type(
Key_type
))/binary>>/binary,
", "/utf8>>/binary,
(get_gleam_type(
Value_type
))/binary>>/binary,
"), decode.DecodeError) {\n"/utf8>>/binary,
" fn(field) {\n"/utf8>>/binary,
" let entry_decoder = {\n"/utf8>>/binary,
" use key <- decode.then("/utf8>>/binary,
Key_decoder/binary>>/binary,
")\n"/utf8>>/binary,
" use value <- decode.then("/utf8>>/binary,
Value_decoder/binary>>/binary,
")\n"/utf8>>/binary,
" decode.success(#(key, value))\n"/utf8>>/binary,
" }\n"/utf8>>/binary,
" case decode.message_field(_, entry_decoder)(field) {\n"/utf8>>/binary,
" Ok(entry) -> Ok(entry)\n"/utf8>>/binary,
" Error(err) -> Error(err)\n"/utf8>>/binary,
" }\n"/utf8>>/binary,
" }\n"/utf8>>/binary,
"}"/utf8>>.
-file("src/protozoa/internal/codegen/decoders.gleam", 79).
?DOC(false).
-spec generate_map_helper_functions(protozoa@parser:message()) -> binary().
generate_map_helper_functions(Message) ->
Map_fields = gleam@list:filter(
erlang:element(3, Message),
fun(Field) -> case erlang:element(3, Field) of
{map, _, _} ->
true;
_ ->
false
end end
),
_pipe = gleam@list:map(
Map_fields,
fun(Field@1) -> case erlang:element(3, Field@1) of
{map, Key_type, Value_type} ->
Field_num = erlang:integer_to_binary(
erlang:element(4, Field@1)
),
generate_map_entry_decoder(Field_num, Key_type, Value_type);
_ ->
<<""/utf8>>
end end
),
gleam@string:join(_pipe, <<"\n\n"/utf8>>).
-file("src/protozoa/internal/codegen/decoders.gleam", 252).
?DOC(false).
-spec get_field_decoder_for_type(protozoa@parser:proto_type()) -> binary().
get_field_decoder_for_type(Field_type) ->
case Field_type of
string ->
<<"decode.string_field"/utf8>>;
int32 ->
<<"decode.int32_field"/utf8>>;
bool ->
<<"decode.bool_field"/utf8>>;
bytes ->
<<"decode.bytes_field"/utf8>>;
float ->
<<"decode.float_field"/utf8>>;
double ->
<<"decode.double_field"/utf8>>;
{message_type, Name} ->
Decoder_name = <<(string:lowercase(
protozoa@internal@codegen@types:flatten_type_name(Name)
))/binary,
"_decoder"/utf8>>,
<<<<"decode.message_field(_, "/utf8, Decoder_name/binary>>/binary,
"())"/utf8>>;
{enum_type, Name@1} ->
Decoder_name@1 = <<<<"decode_"/utf8,
(string:lowercase(
protozoa@internal@codegen@types:flatten_type_name(
Name@1
)
))/binary>>/binary,
"_from_field"/utf8>>,
Decoder_name@1;
_ ->
<<"decode.string_field"/utf8>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 187).
?DOC(false).
-spec generate_oneof_field_checks(list(protozoa@parser:field())) -> binary().
generate_oneof_field_checks(Fields) ->
case Fields of
[] ->
<<" Ok(option.None)\n"/utf8>>;
[Field] ->
Field_num = erlang:integer_to_binary(erlang:element(4, Field)),
Base_variant_name = protozoa@internal@codegen@types:capitalize_first(
erlang:element(2, Field)
),
Variant_name = case {Base_variant_name, erlang:element(3, Field)} of
{<<"Empty"/utf8>>,
{message_type, <<"google.protobuf.Empty"/utf8>>}} ->
<<"EmptyData"/utf8>>;
{<<"StringValue"/utf8>>, string} ->
<<"StringValueVariant"/utf8>>;
{<<"BoolValue"/utf8>>, bool} ->
<<"BoolValueVariant"/utf8>>;
{<<"ListValue"/utf8>>, {message_type, <<"ListValue"/utf8>>}} ->
<<"ListValueVariant"/utf8>>;
{Name, _} ->
Name
end,
Field_decoder = get_field_decoder_for_type(erlang:element(3, Field)),
<<<<<<<<<<<<<<<<<<<<<<<<<<<<" case dict.get(fields, "/utf8,
Field_num/binary>>/binary,
") {\n"/utf8>>/binary,
" Ok([field, ..]) -> {\n"/utf8>>/binary,
" case "/utf8>>/binary,
Field_decoder/binary>>/binary,
"(field) {\n"/utf8>>/binary,
" Ok(value) -> Ok(option.Some("/utf8>>/binary,
Variant_name/binary>>/binary,
"(value)))\n"/utf8>>/binary,
" Error(_) -> Ok(option.None)\n"/utf8>>/binary,
" }\n"/utf8>>/binary,
" }\n"/utf8>>/binary,
" _ -> Ok(option.None)\n"/utf8>>/binary,
" }\n"/utf8>>;
[Field@1 | Rest] ->
Field_num@1 = erlang:integer_to_binary(erlang:element(4, Field@1)),
Base_variant_name@1 = protozoa@internal@codegen@types:capitalize_first(
erlang:element(2, Field@1)
),
Variant_name@1 = case {Base_variant_name@1,
erlang:element(3, Field@1)} of
{<<"Empty"/utf8>>,
{message_type, <<"google.protobuf.Empty"/utf8>>}} ->
<<"EmptyData"/utf8>>;
{<<"StringValue"/utf8>>, string} ->
<<"StringValueVariant"/utf8>>;
{<<"BoolValue"/utf8>>, bool} ->
<<"BoolValueVariant"/utf8>>;
{<<"ListValue"/utf8>>, {message_type, <<"ListValue"/utf8>>}} ->
<<"ListValueVariant"/utf8>>;
{Name@1, _} ->
Name@1
end,
Field_decoder@1 = get_field_decoder_for_type(
erlang:element(3, Field@1)
),
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" case dict.get(fields, "/utf8,
Field_num@1/binary>>/binary,
") {\n"/utf8>>/binary,
" Ok([field, ..]) -> {\n"/utf8>>/binary,
" case "/utf8>>/binary,
Field_decoder@1/binary>>/binary,
"(field) {\n"/utf8>>/binary,
" Ok(value) -> Ok(option.Some("/utf8>>/binary,
Variant_name@1/binary>>/binary,
"(value)))\n"/utf8>>/binary,
" Error(_) -> {\n"/utf8>>/binary,
(generate_oneof_field_checks(Rest))/binary>>/binary,
" }\n"/utf8>>/binary,
" }\n"/utf8>>/binary,
" }\n"/utf8>>/binary,
" _ -> {\n"/utf8>>/binary,
(generate_oneof_field_checks(Rest))/binary>>/binary,
" }\n"/utf8>>/binary,
" }\n"/utf8>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 166).
?DOC(false).
-spec generate_single_oneof_decoder(binary(), protozoa@parser:oneof()) -> binary().
generate_single_oneof_decoder(Message_name, Oneof) ->
Function_name = <<<<"oneof_"/utf8,
(string:lowercase(erlang:element(2, Oneof)))/binary>>/binary,
"_decoder"/utf8>>,
Oneof_type_name = <<(protozoa@internal@codegen@types:capitalize_first(
Message_name
))/binary,
(protozoa@internal@codegen@types:capitalize_first(
erlang:element(2, Oneof)
))/binary>>,
Field_checks = generate_oneof_field_checks(erlang:element(3, Oneof)),
<<<<<<<<<<<<<<<<"fn "/utf8, Function_name/binary>>/binary,
"() -> decode.Decoder(option.Option("/utf8>>/binary,
Oneof_type_name/binary>>/binary,
")) {\n"/utf8>>/binary,
" decode.from_field_dict(fn(fields) {\n"/utf8>>/binary,
Field_checks/binary>>/binary,
" })\n"/utf8>>/binary,
"}"/utf8>>.
-file("src/protozoa/internal/codegen/decoders.gleam", 73).
?DOC(false).
-spec generate_oneof_helper_functions(protozoa@parser:message()) -> binary().
generate_oneof_helper_functions(Message) ->
_pipe = erlang:element(4, Message),
_pipe@1 = gleam@list:map(
_pipe,
fun(Oneof) ->
generate_single_oneof_decoder(erlang:element(2, Message), Oneof)
end
),
gleam@string:join(_pipe@1, <<"\n\n"/utf8>>).
-file("src/protozoa/internal/codegen/decoders.gleam", 322).
?DOC(false).
-spec generate_type_decoder(protozoa@parser:proto_type(), binary()) -> binary().
generate_type_decoder(Proto_type, Field_num) ->
case Proto_type of
string ->
<<<<"decode.string_with_default("/utf8, Field_num/binary>>/binary,
", \"\")"/utf8>>;
int32 ->
<<<<"decode.int32_with_default("/utf8, Field_num/binary>>/binary,
", 0)"/utf8>>;
int64 ->
<<<<"decode.int64_with_default("/utf8, Field_num/binary>>/binary,
", 0)"/utf8>>;
u_int32 ->
<<<<"decode.uint32_with_default("/utf8, Field_num/binary>>/binary,
", 0)"/utf8>>;
u_int64 ->
<<<<"decode.uint64_with_default("/utf8, Field_num/binary>>/binary,
", 0)"/utf8>>;
s_int32 ->
<<<<"decode.sint32("/utf8, Field_num/binary>>/binary, ")"/utf8>>;
s_int64 ->
<<<<"decode.sint64("/utf8, Field_num/binary>>/binary, ")"/utf8>>;
fixed32 ->
<<<<"decode.fixed32("/utf8, Field_num/binary>>/binary, ")"/utf8>>;
fixed64 ->
<<<<"decode.fixed64("/utf8, Field_num/binary>>/binary, ")"/utf8>>;
s_fixed32 ->
<<<<"decode.sfixed32("/utf8, Field_num/binary>>/binary, ")"/utf8>>;
s_fixed64 ->
<<<<"decode.sfixed64("/utf8, Field_num/binary>>/binary, ")"/utf8>>;
bool ->
<<<<"decode.bool_with_default("/utf8, Field_num/binary>>/binary,
", False)"/utf8>>;
bytes ->
<<<<"decode.bytes("/utf8, Field_num/binary>>/binary, ")"/utf8>>;
float ->
<<<<"decode.float("/utf8, Field_num/binary>>/binary, ")"/utf8>>;
double ->
<<<<"decode.double("/utf8, Field_num/binary>>/binary, ")"/utf8>>;
{message_type, Name} ->
<<<<<<<<"decode.nested_message("/utf8, Field_num/binary>>/binary,
", "/utf8>>/binary,
(string:lowercase(
protozoa@internal@codegen@types:flatten_type_name(Name)
))/binary>>/binary,
"_decoder())"/utf8>>;
{enum_type, Name@1} ->
<<<<<<<<"decode_"/utf8,
(string:lowercase(
protozoa@internal@codegen@types:flatten_type_name(
Name@1
)
))/binary>>/binary,
"_field("/utf8>>/binary,
Field_num/binary>>/binary,
")"/utf8>>;
{map, _, _} ->
<<<<<<<<"decode.repeated_field("/utf8, Field_num/binary>>/binary,
", fn(field) { map_entry_"/utf8>>/binary,
Field_num/binary>>/binary,
"_decoder()(field) })"/utf8>>;
_ ->
<<"decode.fail(\"Unsupported type\")"/utf8>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 403).
?DOC(false).
-spec generate_simple_type_decoder(protozoa@parser:proto_type()) -> binary().
generate_simple_type_decoder(Proto_type) ->
case Proto_type of
string ->
<<"decode.string_field(field)"/utf8>>;
int32 ->
<<"decode.int32_field(field)"/utf8>>;
int64 ->
<<"decode.int64_field(field)"/utf8>>;
u_int32 ->
<<"decode.uint32_field(field)"/utf8>>;
u_int64 ->
<<"decode.uint64_field(field)"/utf8>>;
bool ->
<<"decode.bool_field(field)"/utf8>>;
bytes ->
<<"decode.bytes_field(field)"/utf8>>;
float ->
<<"decode.float_field(field)"/utf8>>;
double ->
<<"decode.double_field(field)"/utf8>>;
{message_type, Name} ->
<<<<"decode.message_field(_, "/utf8,
(string:lowercase(
protozoa@internal@codegen@types:flatten_type_name(Name)
))/binary>>/binary,
"_decoder())(field)"/utf8>>;
_ ->
<<"Error(decode.DecodeError(expected: \"supported field type\", found: \"unsupported field type\", path: []))"/utf8>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 381).
?DOC(false).
-spec generate_repeated_type_decoder(protozoa@parser:proto_type(), binary()) -> binary().
generate_repeated_type_decoder(Inner_type, Field_num) ->
case Inner_type of
string ->
<<<<"decode.repeated_string("/utf8, Field_num/binary>>/binary,
")"/utf8>>;
int32 ->
<<<<"decode.repeated_int32("/utf8, Field_num/binary>>/binary,
")"/utf8>>;
{enum_type, Name} ->
<<<<<<<<"decode_repeated_"/utf8,
(string:lowercase(
protozoa@internal@codegen@types:flatten_type_name(
Name
)
))/binary>>/binary,
"("/utf8>>/binary,
Field_num/binary>>/binary,
")"/utf8>>;
_ ->
<<<<<<<<"decode.repeated_field("/utf8, Field_num/binary>>/binary,
", fn(field) { "/utf8>>/binary,
(generate_simple_type_decoder(Inner_type))/binary>>/binary,
" })"/utf8>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 423).
?DOC(false).
-spec generate_simple_field_decoder_name(protozoa@parser:proto_type()) -> binary().
generate_simple_field_decoder_name(Proto_type) ->
case Proto_type of
string ->
<<"decode.string_field"/utf8>>;
int32 ->
<<"decode.int32_field"/utf8>>;
int64 ->
<<"decode.int64_field"/utf8>>;
u_int32 ->
<<"decode.uint32_field"/utf8>>;
u_int64 ->
<<"decode.uint64_field"/utf8>>;
bool ->
<<"decode.bool_field"/utf8>>;
bytes ->
<<"decode.bytes_field"/utf8>>;
float ->
<<"decode.float_field"/utf8>>;
double ->
<<"decode.double_field"/utf8>>;
_ ->
<<"fn(_field) { Error(decode.DecodeError(expected: \"supported field type\", found: \"unsupported field type\", path: [])) }"/utf8>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 361).
?DOC(false).
-spec generate_optional_type_decoder(protozoa@parser:proto_type(), binary()) -> binary().
generate_optional_type_decoder(Inner_type, Field_num) ->
case Inner_type of
{message_type, Name} ->
<<<<<<<<"decode.optional_nested_message("/utf8, Field_num/binary>>/binary,
", "/utf8>>/binary,
(string:lowercase(
protozoa@internal@codegen@types:flatten_type_name(Name)
))/binary>>/binary,
"_decoder())"/utf8>>;
_ ->
<<<<<<<<"decode.optional_field("/utf8, Field_num/binary>>/binary,
", "/utf8>>/binary,
(generate_simple_field_decoder_name(Inner_type))/binary>>/binary,
")"/utf8>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 312).
?DOC(false).
-spec generate_field_decoder_call(protozoa@parser:field()) -> binary().
generate_field_decoder_call(Field) ->
Field_num = erlang:integer_to_binary(erlang:element(4, Field)),
case erlang:element(3, Field) of
{optional, Inner} ->
generate_optional_type_decoder(Inner, Field_num);
{repeated, Inner@1} ->
generate_repeated_type_decoder(Inner@1, Field_num);
_ ->
generate_type_decoder(erlang:element(3, Field), Field_num)
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 304).
?DOC(false).
-spec generate_field_decoder(protozoa@parser:field()) -> binary().
generate_field_decoder(Field) ->
_ = erlang:integer_to_binary(erlang:element(4, Field)),
Decoder_call = generate_field_decoder_call(Field),
Escaped_field_name = protozoa@internal@codegen@types:escape_keyword(
erlang:element(2, Field)
),
<<<<<<<<" use "/utf8, Escaped_field_name/binary>>/binary,
" <- decode.then("/utf8>>/binary,
Decoder_call/binary>>/binary,
")"/utf8>>.
-file("src/protozoa/internal/codegen/decoders.gleam", 439).
?DOC(false).
-spec generate_constructor_call(protozoa@parser:message()) -> binary().
generate_constructor_call(Message) ->
Field_names = begin
_pipe = erlang:element(3, Message),
gleam@list:map(
_pipe,
fun(Field) ->
Escaped_name = protozoa@internal@codegen@types:escape_keyword(
erlang:element(2, Field)
),
<<<<Escaped_name/binary, ": "/utf8>>/binary,
Escaped_name/binary>>
end
)
end,
Oneof_names = begin
_pipe@1 = erlang:element(4, Message),
gleam@list:map(
_pipe@1,
fun(Oneof) ->
Escaped_name@1 = protozoa@internal@codegen@types:escape_keyword(
erlang:element(2, Oneof)
),
<<<<Escaped_name@1/binary, ": "/utf8>>/binary,
Escaped_name@1/binary>>
end
)
end,
All_names = lists:append(Field_names, Oneof_names),
case All_names of
[] ->
<<<<" decode.success("/utf8, (erlang:element(2, Message))/binary>>/binary,
")"/utf8>>;
[Single] ->
<<<<<<<<" decode.success("/utf8,
(erlang:element(2, Message))/binary>>/binary,
"("/utf8>>/binary,
Single/binary>>/binary,
"))"/utf8>>;
_ ->
case erlang:length(All_names) > 4 of
true ->
Names_str = gleam@string:join(All_names, <<",\n "/utf8>>),
<<<<<<<<" decode.success("/utf8,
(erlang:element(2, Message))/binary>>/binary,
"(\n "/utf8>>/binary,
Names_str/binary>>/binary,
",\n ))"/utf8>>;
false ->
Names_str@1 = gleam@string:join(All_names, <<", "/utf8>>),
<<<<<<<<" decode.success("/utf8,
(erlang:element(2, Message))/binary>>/binary,
"("/utf8>>/binary,
Names_str@1/binary>>/binary,
"))"/utf8>>
end
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 274).
?DOC(false).
-spec generate_decoder_function_body(protozoa@parser:message()) -> binary().
generate_decoder_function_body(Message) ->
Field_decoders = begin
_pipe = erlang:element(3, Message),
_pipe@1 = gleam@list:map(_pipe, fun generate_field_decoder/1),
gleam@string:join(_pipe@1, <<"\n"/utf8>>)
end,
Oneof_decoders = begin
_pipe@2 = erlang:element(4, Message),
_pipe@3 = gleam@list:map(
_pipe@2,
fun(Oneof) ->
Escaped_oneof_name = protozoa@internal@codegen@types:escape_keyword(
erlang:element(2, Oneof)
),
Function_name = <<<<"oneof_"/utf8,
(string:lowercase(erlang:element(2, Oneof)))/binary>>/binary,
"_decoder"/utf8>>,
<<<<<<<<" use "/utf8, Escaped_oneof_name/binary>>/binary,
" <- decode.then("/utf8>>/binary,
Function_name/binary>>/binary,
"())"/utf8>>
end
),
gleam@string:join(_pipe@3, <<"\n"/utf8>>)
end,
Constructor_call = generate_constructor_call(Message),
case {Field_decoders, Oneof_decoders} of
{<<""/utf8>>, <<""/utf8>>} ->
Constructor_call;
{Fields, <<""/utf8>>} ->
<<<<Fields/binary, "\n"/utf8>>/binary, Constructor_call/binary>>;
{<<""/utf8>>, Oneofs} ->
<<<<Oneofs/binary, "\n"/utf8>>/binary, Constructor_call/binary>>;
{Fields@1, Oneofs@1} ->
<<<<<<<<Fields@1/binary, "\n"/utf8>>/binary, Oneofs@1/binary>>/binary,
"\n"/utf8>>/binary,
Constructor_call/binary>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 478).
?DOC(false).
-spec generate_wrapper_function_body(protozoa@parser:message(), binary()) -> binary().
generate_wrapper_function_body(_, Decoder_fn_name) ->
<<<<" decode.run(data, "/utf8, Decoder_fn_name/binary>>/binary,
"())"/utf8>>.
-file("src/protozoa/internal/codegen/decoders.gleam", 29).
?DOC(false).
-spec generate_message_decoder_with_registry(
protozoa@parser:message(),
protozoa@internal@type_registry:type_registry(),
binary()
) -> binary().
generate_message_decoder_with_registry(Message, _, _) ->
Decoder_fn_name = <<(string:lowercase(erlang:element(2, Message)))/binary,
"_decoder"/utf8>>,
Decode_fn_name = <<"decode_"/utf8,
(string:lowercase(erlang:element(2, Message)))/binary>>,
Decoder_body = generate_decoder_function_body(Message),
Wrapper_body = generate_wrapper_function_body(Message, Decoder_fn_name),
Oneof_helpers = generate_oneof_helper_functions(Message),
Map_helpers = generate_map_helper_functions(Message),
Main_decoder = <<<<<<<<<<<<<<<<<<<<<<<<<<"pub fn "/utf8,
Decoder_fn_name/binary>>/binary,
"() -> decode.Decoder("/utf8>>/binary,
(erlang:element(2, Message))/binary>>/binary,
") {\n"/utf8>>/binary,
Decoder_body/binary>>/binary,
"\n}\n\n"/utf8>>/binary,
"pub fn "/utf8>>/binary,
Decode_fn_name/binary>>/binary,
"(data: BitArray) -> Result("/utf8>>/binary,
(erlang:element(2, Message))/binary>>/binary,
", List(decode.DecodeError)) {\n"/utf8>>/binary,
Wrapper_body/binary>>/binary,
"\n}"/utf8>>,
All_helpers = case {Oneof_helpers, Map_helpers} of
{<<""/utf8>>, <<""/utf8>>} ->
<<""/utf8>>;
{Helpers, <<""/utf8>>} ->
<<Helpers/binary, "\n\n"/utf8>>;
{<<""/utf8>>, Helpers@1} ->
<<Helpers@1/binary, "\n\n"/utf8>>;
{Oneof, Map} ->
<<<<<<Oneof/binary, "\n\n"/utf8>>/binary, Map/binary>>/binary,
"\n\n"/utf8>>
end,
case All_helpers of
<<""/utf8>> ->
Main_decoder;
Helpers@2 ->
<<Helpers@2/binary, Main_decoder/binary>>
end.
-file("src/protozoa/internal/codegen/decoders.gleam", 495).
?DOC(false).
-spec collect_nested_messages_flattened(
list(protozoa@parser:message()),
binary()
) -> list(protozoa@parser:message()).
collect_nested_messages_flattened(Nested_messages, Parent_name) ->
gleam@list:fold(
Nested_messages,
[],
fun(Acc, Nested_msg) ->
Flattened_name = <<Parent_name/binary,
(erlang:element(2, Nested_msg))/binary>>,
Flattened_msg = {message,
Flattened_name,
erlang:element(3, Nested_msg),
erlang:element(4, Nested_msg),
erlang:element(5, Nested_msg),
erlang:element(6, Nested_msg)},
Deeper_nested = collect_nested_messages_flattened(
erlang:element(5, Nested_msg),
Flattened_name
),
[Flattened_msg | lists:append(Deeper_nested, Acc)]
end
).
-file("src/protozoa/internal/codegen/decoders.gleam", 487).
?DOC(false).
-spec collect_all_messages_flattened(list(protozoa@parser:message())) -> list(protozoa@parser:message()).
collect_all_messages_flattened(Messages) ->
gleam@list:fold(
Messages,
[],
fun(Acc, Msg) ->
Nested = collect_nested_messages_flattened(
erlang:element(5, Msg),
erlang:element(2, Msg)
),
[Msg | lists:append(Nested, Acc)]
end
).
-file("src/protozoa/internal/codegen/decoders.gleam", 14).
?DOC(false).
-spec generate_decoders_with_registry(
list(protozoa@parser:message()),
protozoa@internal@type_registry:type_registry(),
binary()
) -> binary().
generate_decoders_with_registry(Messages, Registry, File_path) ->
All_messages = collect_all_messages_flattened(Messages),
_pipe = All_messages,
_pipe@1 = gleam@list:map(
_pipe,
fun(Message) ->
generate_message_decoder_with_registry(Message, Registry, File_path)
end
),
gleam@string:join(_pipe@1, <<"\n\n"/utf8>>).