Current section
Files
Jump to
Current section
Files
src/atproto_codegen@emit@union.erl
-module(atproto_codegen@emit@union).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/atproto_codegen/emit/union.gleam").
-export([emit_union/6]).
-export_type([union_parts/0, variant/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(false).
-type union_parts() :: {union_parts, binary(), binary(), binary()}.
-type variant() :: {variant,
binary(),
binary(),
binary(),
list(binary()),
binary(),
binary()}.
-file("src/atproto_codegen/emit/union.gleam", 34).
?DOC(false).
-spec union_variant(
atproto_codegen@config:config(),
binary(),
binary(),
binary()
) -> variant().
union_variant(Config, Nsid, Name, Ref) ->
R = atproto_codegen@naming:parse_ref(Nsid, Ref),
Ref_name = atproto_codegen@naming:ref_type_name(
erlang:element(5, Config),
R
),
Qual = atproto_codegen@naming:qualifier(
erlang:element(5, Config),
Nsid,
erlang:element(2, R)
),
{Primary_key, Extra_keys} = case erlang:element(3, R) of
<<"main"/utf8>> ->
{erlang:element(2, R),
[<<(erlang:element(2, R))/binary, "#main"/utf8>>]};
Def_name ->
{<<<<(erlang:element(2, R))/binary, "#"/utf8>>/binary,
Def_name/binary>>,
[]}
end,
{variant,
<<Name/binary, Ref_name/binary>>,
<<Qual/binary, Ref_name/binary>>,
Primary_key,
Extra_keys,
<<<<Qual/binary, (justin:snake_case(Ref_name))/binary>>/binary,
"_fields"/utf8>>,
<<<<Qual/binary, (justin:snake_case(Ref_name))/binary>>/binary,
"_decoder()"/utf8>>}.
-file("src/atproto_codegen/emit/union.gleam", 58).
?DOC(false).
-spec emit_union(
atproto_codegen@emit@zero:zero_plan(),
atproto_codegen@config:config(),
binary(),
binary(),
list(binary()),
atproto_codegen@lower:openness()
) -> union_parts().
emit_union(Plan, Config, Nsid, Name, Refs, Openness) ->
Variants = gleam@list:map(
Refs,
fun(_capture) -> union_variant(Config, Nsid, Name, _capture) end
),
Snake = justin:snake_case(Name),
Type_lines = gleam@list:map(
Variants,
fun(V) ->
<<<<<<<<" "/utf8, (erlang:element(2, V))/binary>>/binary,
"("/utf8>>/binary,
(erlang:element(3, V))/binary>>/binary,
")"/utf8>>
end
),
Type_lines@1 = case Openness of
closed ->
Type_lines;
open ->
lists:append(
Type_lines,
[<<<<" "/utf8, Name/binary>>/binary,
"Other(dynamic.Dynamic)"/utf8>>]
)
end,
Type_def = <<<<<<<<"pub type "/utf8, Name/binary>>/binary, " {\n"/utf8>>/binary,
(gleam@string:join(Type_lines@1, <<"\n"/utf8>>))/binary>>/binary,
"\n}"/utf8>>,
Encode_arms = gleam@list:map(
Variants,
fun(V@1) ->
<<<<<<<<<<<<" "/utf8, (erlang:element(2, V@1))/binary>>/binary,
"(inner) ->\n json.object([\n #(\"$type\", json.string(\""/utf8>>/binary,
(atproto_codegen@emit@exprs:escape(
erlang:element(4, V@1)
))/binary>>/binary,
"\")),\n .."/utf8>>/binary,
(erlang:element(6, V@1))/binary>>/binary,
"(inner)\n ])"/utf8>>
end
),
Encode_arms@1 = case Openness of
closed ->
Encode_arms;
open ->
lists:append(
Encode_arms,
[<<<<" "/utf8, Name/binary>>/binary,
"Other(inner) -> internal.dynamic_to_json(inner)"/utf8>>]
)
end,
Encoder = <<<<<<<<<<<<"pub fn encode_"/utf8, Snake/binary>>/binary,
"(value: "/utf8>>/binary,
Name/binary>>/binary,
") -> json.Json {\n case value {\n"/utf8>>/binary,
(gleam@string:join(Encode_arms@1, <<"\n"/utf8>>))/binary>>/binary,
"\n }\n}"/utf8>>,
Decode_arms = gleam@list:map(
Variants,
fun(V@2) ->
Patterns = begin
_pipe = [erlang:element(4, V@2) | erlang:element(5, V@2)],
_pipe@1 = gleam@list:map(
_pipe,
fun(K) ->
<<<<"\""/utf8,
(atproto_codegen@emit@exprs:escape(K))/binary>>/binary,
"\""/utf8>>
end
),
gleam@string:join(_pipe@1, <<" | "/utf8>>)
end,
<<<<<<<<<<<<" "/utf8, Patterns/binary>>/binary,
" -> decode.map("/utf8>>/binary,
(erlang:element(7, V@2))/binary>>/binary,
", "/utf8>>/binary,
(erlang:element(2, V@2))/binary>>/binary,
")"/utf8>>
end
),
Fallback_arm = case Openness of
closed ->
<<<<<<<<" _ -> decode.failure("/utf8,
(atproto_codegen@emit@exprs:zero_expr(
Plan,
Config,
Nsid,
Name,
{t_union, Refs, closed}
))/binary>>/binary,
", \""/utf8>>/binary,
(atproto_codegen@emit@exprs:escape(Name))/binary>>/binary,
"\")"/utf8>>;
open ->
<<<<" _ -> decode.map(decode.dynamic, "/utf8, Name/binary>>/binary,
"Other)"/utf8>>
end,
Decode_arms@1 = lists:append(Decode_arms, [Fallback_arm]),
Decoder = <<<<<<<<<<<<"pub fn "/utf8, Snake/binary>>/binary,
"_decoder() -> decode.Decoder("/utf8>>/binary,
Name/binary>>/binary,
") {\n use tag <- decode.optional_field(\"$type\", \"\", decode.string)\n case tag {\n"/utf8>>/binary,
(gleam@string:join(Decode_arms@1, <<"\n"/utf8>>))/binary>>/binary,
"\n }\n}"/utf8>>,
{union_parts, Type_def, Encoder, Decoder}.