Packages

Generate typed Gleam modules from a SQL schema file

Current section

Files

Jump to
glsql src glsql.erl
Raw

src/glsql.erl

-module(glsql).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glsql.gleam").
-export([run/1, main/0]).
-file("src/glsql.gleam", 95).
-spec render_all(list(glsql@error:error()), binary(), binary()) -> binary().
render_all(Errors, Filename, Source) ->
_pipe = Errors,
_pipe@1 = gleam@list:map(
_pipe,
fun(_capture) -> glsql@error:render(_capture, Filename, Source) end
),
gleam@string:join(_pipe@1, <<"\n"/utf8>>).
-file("src/glsql.gleam", 28).
-spec run(binary()) -> {ok, integer()} | {error, binary()}.
run(Config_path) ->
gleam@result:'try'(
begin
_pipe = glsql@config:load(Config_path),
gleam@result:map_error(
_pipe,
fun(_capture) ->
glsql@error:render(_capture, Config_path, <<""/utf8>>)
end
)
end,
fun(Cfg) ->
gleam@result:'try'(
begin
_pipe@1 = simplifile:read(erlang:element(2, Cfg)),
gleam@result:map_error(
_pipe@1,
fun(E) ->
<<<<<<<<"error: could not read "/utf8,
(erlang:element(2, Cfg))/binary>>/binary,
" ("/utf8>>/binary,
(gleam@string:inspect(E))/binary>>/binary,
")"/utf8>>
end
)
end,
fun(Source) ->
gleam@result:'try'(
begin
_pipe@2 = glsql@lexer:lex(Source),
gleam@result:map_error(
_pipe@2,
fun(_capture@1) ->
glsql@error:render(
_capture@1,
erlang:element(2, Cfg),
Source
)
end
)
end,
fun(Tokens) ->
gleam@result:'try'(
begin
_pipe@3 = glsql@parser:parse(Tokens),
gleam@result:map_error(
_pipe@3,
fun(_capture@2) ->
glsql@error:render(
_capture@2,
erlang:element(2, Cfg),
Source
)
end
)
end,
fun(Schema) ->
gleam@result:'try'(
begin
_pipe@4 = glsql@validate:check(
Schema,
Cfg
),
gleam@result:map_error(
_pipe@4,
fun(_capture@3) ->
render_all(
_capture@3,
erlang:element(2, Cfg),
Source
)
end
)
end,
fun(_) ->
gleam@result:'try'(
begin
_pipe@5 = glsql@resolve:resolve(
Schema,
Cfg
),
gleam@result:map_error(
_pipe@5,
fun(_capture@4) ->
render_all(
_capture@4,
erlang:element(
2,
Cfg
),
Source
)
end
)
end,
fun(Resolved) ->
Files = gleam@list:map(
erlang:element(
2,
Resolved
),
fun(Table) ->
{<<<<<<(erlang:element(
3,
Cfg
))/binary,
"/"/utf8>>/binary,
(erlang:element(
3,
Table
))/binary>>/binary,
".gleam"/utf8>>,
glsql@codegen:generate_table(
Table,
erlang:element(
4,
Cfg
),
erlang:element(
2,
Cfg
)
)}
end
),
gleam@result:'try'(
begin
_pipe@6 = simplifile:create_directory_all(
erlang:element(
3,
Cfg
)
),
gleam@result:map_error(
_pipe@6,
fun(E@1) ->
<<<<<<<<"error: could not create "/utf8,
(erlang:element(
3,
Cfg
))/binary>>/binary,
" ("/utf8>>/binary,
(gleam@string:inspect(
E@1
))/binary>>/binary,
")"/utf8>>
end
)
end,
fun(_) ->
gleam@result:'try'(
gleam@list:try_each(
Files,
fun(File) ->
{Path,
Contents} = File,
_pipe@7 = simplifile:write(
Path,
Contents
),
gleam@result:map_error(
_pipe@7,
fun(
E@2
) ->
<<<<<<<<"error: could not write "/utf8,
Path/binary>>/binary,
" ("/utf8>>/binary,
(gleam@string:inspect(
E@2
))/binary>>/binary,
")"/utf8>>
end
)
end
),
fun(_) ->
{ok,
erlang:length(
Files
)}
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/glsql.gleam", 14).
-spec main() -> nil.
main() ->
case run(<<"glsql.toml"/utf8>>) of
{ok, Count} ->
gleam_stdlib:println(
<<<<"Generated "/utf8, (gleam@string:inspect(Count))/binary>>/binary,
" modules."/utf8>>
);
{error, Message} ->
gleam_stdlib:println_error(Message),
erlang:halt(1)
end.