Packages

Generate typed Gleam modules from a SQL schema file

Current section

Files

Jump to
glsql src glsql@codegen.erl
Raw

src/glsql@codegen.erl

-module(glsql@codegen).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glsql/codegen.gleam").
-export([generate_table/3]).
-file("src/glsql/codegen.gleam", 180).
-spec bool_literal(boolean()) -> binary().
bool_literal(Value) ->
case Value of
true ->
<<"True"/utf8>>;
false ->
<<"False"/utf8>>
end.
-file("src/glsql/codegen.gleam", 162).
-spec column_const(
glsql@resolve:resolved_table(),
glsql@resolve:resolved_column()
) -> binary().
column_const(Table, C) ->
<<<<<<<<<<<<<<<<<<<<<<<<<<<<"pub const 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>>.
-file("src/glsql/codegen.gleam", 155).
-spec metadata(glsql@resolve:resolved_table()) -> binary().
metadata(Table) ->
_pipe = erlang:element(5, Table),
_pipe@1 = gleam@list:map(_pipe, fun(C) -> column_const(Table, C) end),
_pipe@2 = gleam@string:join(_pipe@1, <<"\n\n"/utf8>>),
gleam@string:append(_pipe@2, <<"\n"/utf8>>).
-file("src/glsql/codegen.gleam", 134).
-spec encode_value(glsql@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/codegen.gleam", 119).
-spec encoder(glsql@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/codegen.gleam", 89).
-spec decoder(glsql@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/codegen.gleam", 76).
-spec constants(glsql@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/codegen.gleam", 61).
-spec record(glsql@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/codegen.gleam", 33).
-spec imports(glsql@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/codegen.gleam", 25).
-spec header(glsql@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/codegen.gleam", 6).
-spec generate_table(glsql@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>>
).