-module(glsql@internal@codegen). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/glsql/internal/codegen.gleam"). -export([generate_table/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/glsql/internal/codegen.gleam", 182). ?DOC(false). -spec bool_literal(boolean()) -> binary(). bool_literal(Value) -> case Value of true -> <<"True"/utf8>>; false -> <<"False"/utf8>> end. -file("src/glsql/internal/codegen.gleam", 162). ?DOC(false). -spec column_accessor( glsql@internal@resolve:resolved_table(), glsql@internal@resolve:resolved_column() ) -> binary(). column_accessor(Table, C) -> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"pub fn col_"/utf8, (erlang:element( 3, C ))/binary>>/binary, "() -> Column("/utf8>>/binary, (erlang:element( 4, C ))/binary>>/binary, ") {\n Column(\""/utf8>>/binary, (erlang:element(2, Table))/binary>>/binary, "\", \""/utf8>>/binary, (erlang:element(2, C))/binary>>/binary, "\", \""/utf8>>/binary, (erlang:element(7, C))/binary>>/binary, "\", "/utf8>>/binary, (bool_literal(erlang:element(8, C)))/binary>>/binary, ", "/utf8>>/binary, (bool_literal(erlang:element(9, C)))/binary>>/binary, ", "/utf8>>/binary, (erlang:element(5, C))/binary>>/binary, ")\n}"/utf8>>. -file("src/glsql/internal/codegen.gleam", 155). ?DOC(false). -spec metadata(glsql@internal@resolve:resolved_table()) -> binary(). metadata(Table) -> _pipe = erlang:element(5, Table), _pipe@1 = gleam@list:map(_pipe, fun(C) -> column_accessor(Table, C) end), _pipe@2 = gleam@string:join(_pipe@1, <<"\n\n"/utf8>>), gleam@string:append(_pipe@2, <<"\n"/utf8>>). -file("src/glsql/internal/codegen.gleam", 134). ?DOC(false). -spec encode_value(glsql@internal@resolve:resolved_column()) -> binary(). encode_value(C) -> Is_list = gleam_stdlib:contains_string( erlang:element(4, C), <<"List("/utf8>> ), Element = fun(Var) -> gleam@string:replace(erlang:element(6, C), <<"$"/utf8>>, Var) end, Value = fun(Var@1) -> case Is_list of true -> <<<<<<<<"pog.array(fn(v) { "/utf8, (Element(<<"v"/utf8>>))/binary>>/binary, " }, "/utf8>>/binary, Var@1/binary>>/binary, ")"/utf8>>; false -> Element(Var@1) end end, case erlang:element(8, C) of true -> <<<<<<<<"pog.nullable(fn(v) { "/utf8, (Value(<<"v"/utf8>>))/binary>>/binary, " }, row."/utf8>>/binary, (erlang:element(3, C))/binary>>/binary, ")"/utf8>>; false -> Value(<<"row."/utf8, (erlang:element(3, C))/binary>>) end. -file("src/glsql/internal/codegen.gleam", 119). ?DOC(false). -spec encoder(glsql@internal@resolve:resolved_table(), binary()) -> binary(). encoder(Table, Driver) -> Values = begin _pipe = erlang:element(5, Table), _pipe@1 = gleam@list:map( _pipe, fun(C) -> <<<<" "/utf8, (encode_value(C))/binary>>/binary, ","/utf8>> end ), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end, <<<<<<<<<<<<"pub fn to_params(row: "/utf8, (erlang:element(4, Table))/binary>>/binary, ") -> List("/utf8>>/binary, Driver/binary>>/binary, ".Value) {\n [\n"/utf8>>/binary, Values/binary>>/binary, "\n ]\n}\n"/utf8>>. -file("src/glsql/internal/codegen.gleam", 89). ?DOC(false). -spec decoder(glsql@internal@resolve:resolved_table()) -> binary(). decoder(Table) -> Fields = begin _pipe = erlang:element(5, Table), _pipe@1 = gleam@list:index_map( _pipe, fun(C, I) -> <<<<<<<<<<<<" use "/utf8, (erlang:element(3, C))/binary>>/binary, " <- decode.field("/utf8>>/binary, (erlang:integer_to_binary(I))/binary>>/binary, ", "/utf8>>/binary, (erlang:element(5, C))/binary>>/binary, ")"/utf8>> end ), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end, Labels = begin _pipe@2 = erlang:element(5, Table), _pipe@3 = gleam@list:map( _pipe@2, fun(C@1) -> <<(erlang:element(3, C@1))/binary, ":"/utf8>> end ), gleam@string:join(_pipe@3, <<", "/utf8>>) end, <<<<<<<<<<<<<<<<"pub fn decoder() -> decode.Decoder("/utf8, (erlang:element(4, Table))/binary>>/binary, ") {\n"/utf8>>/binary, Fields/binary>>/binary, "\n decode.success("/utf8>>/binary, (erlang:element(4, Table))/binary>>/binary, "("/utf8>>/binary, Labels/binary>>/binary, "))\n}\n"/utf8>>. -file("src/glsql/internal/codegen.gleam", 76). ?DOC(false). -spec constants(glsql@internal@resolve:resolved_table()) -> binary(). constants(Table) -> Names = begin _pipe = erlang:element(5, Table), _pipe@1 = gleam@list:map(_pipe, fun(C) -> erlang:element(2, C) end), gleam@string:join(_pipe@1, <<", "/utf8>>) end, <<<<<<<<"pub const table: String = \""/utf8, (erlang:element(2, Table))/binary>>/binary, "\"\n\n/// Columns in declaration order. Pair with `decoder()` so the SELECT\n/// order always matches the positional decoder.\npub const columns: String = \""/utf8>>/binary, Names/binary>>/binary, "\"\n"/utf8>>. -file("src/glsql/internal/codegen.gleam", 61). ?DOC(false). -spec record(glsql@internal@resolve:resolved_table()) -> binary(). record(Table) -> Fields = begin _pipe = erlang:element(5, Table), _pipe@1 = gleam@list:map( _pipe, fun(C) -> <<<<<<<<" "/utf8, (erlang:element(3, C))/binary>>/binary, ": "/utf8>>/binary, (erlang:element(4, C))/binary>>/binary, ","/utf8>> end ), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end, <<<<<<<<<<<<"pub type "/utf8, (erlang:element(4, Table))/binary>>/binary, " {\n "/utf8>>/binary, (erlang:element(4, Table))/binary>>/binary, "(\n"/utf8>>/binary, Fields/binary>>/binary, "\n )\n}\n"/utf8>>. -file("src/glsql/internal/codegen.gleam", 33). ?DOC(false). -spec imports(glsql@internal@resolve:resolved_table(), binary()) -> binary(). imports(Table, Driver) -> Needs_option = gleam@list:any( erlang:element(5, Table), fun(C) -> erlang:element(8, C) end ), Base = [<<"gleam/dynamic/decode"/utf8>>, <<"glsql/schema"/utf8>>, Driver], Base@1 = case Needs_option of true -> [<<"gleam/option"/utf8>> | Base]; false -> Base end, Custom = gleam@list:flat_map( erlang:element(5, Table), fun(C@1) -> erlang:element(10, C@1) end ), All = begin _pipe = lists:append(Base@1, Custom), _pipe@1 = gleam@list:unique(_pipe), gleam@list:sort(_pipe@1, fun gleam@string:compare/2) end, _pipe@2 = All, _pipe@3 = gleam@list:map(_pipe@2, fun(M) -> case M of <<"gleam/option"/utf8>> -> <<"import gleam/option.{type Option}"/utf8>>; <<"glsql/schema"/utf8>> -> <<"import glsql/schema.{type Column, Column}"/utf8>>; _ -> <<"import "/utf8, M/binary>> end end), _pipe@4 = gleam@string:join(_pipe@3, <<"\n"/utf8>>), gleam@string:append(_pipe@4, <<"\n"/utf8>>). -file("src/glsql/internal/codegen.gleam", 25). ?DOC(false). -spec header(glsql@internal@resolve:resolved_table(), binary()) -> binary(). header(Table, Source) -> <<<<<<<<"// "/utf8, (erlang:element(3, Table))/binary>>/binary, ".gleam\n// Generated by glsql from "/utf8>>/binary, Source/binary>>/binary, ". Do not edit.\n"/utf8>>. -file("src/glsql/internal/codegen.gleam", 6). ?DOC(false). -spec generate_table( glsql@internal@resolve:resolved_table(), binary(), binary() ) -> binary(). generate_table(Table, Driver, Source) -> gleam@string:join( [header(Table, Source), imports(Table, Driver), record(Table), constants(Table), decoder(Table), encoder(Table, Driver), metadata(Table)], <<"\n"/utf8>> ).