Packages
oaspec
0.3.0
0.68.0
0.67.0
0.66.0
0.65.0
0.64.0
0.63.0
0.62.0
0.61.0
0.60.0
0.59.0
0.58.1
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.3
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.1.3
Generate Gleam code from OpenAPI 3.x specifications
Current section
Files
Jump to
Current section
Files
src/oaspec@codegen@writer.erl
-module(oaspec@codegen@writer).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/oaspec/codegen/writer.gleam").
-export([generate_all/2, error_to_string/1]).
-export_type([write_error/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.
-type write_error() :: {directory_create_error, binary(), binary()} |
{file_write_error, binary(), binary()}.
-file("src/oaspec/codegen/writer.gleam", 65).
?DOC(" Generate shared files (types, decoders, encoders, middleware).\n").
-spec generate_shared(oaspec@codegen@context:context()) -> list(oaspec@codegen@context:generated_file()).
generate_shared(Ctx) ->
Type_files = oaspec@codegen@types:generate(Ctx),
Decoder_files = oaspec@codegen@decoders:generate(Ctx),
Middleware_files = oaspec@codegen@middleware:generate(Ctx),
lists:append([Type_files, Decoder_files, Middleware_files]).
-file("src/oaspec/codegen/writer.gleam", 74).
?DOC(" Ensure a directory exists, creating it if necessary.\n").
-spec ensure_directory(binary()) -> {ok, nil} | {error, write_error()}.
ensure_directory(Path) ->
_pipe = simplifile:create_directory_all(Path),
gleam@result:map_error(
_pipe,
fun(_) ->
{directory_create_error,
Path,
<<"Failed to create directory"/utf8>>}
end
).
-file("src/oaspec/codegen/writer.gleam", 82).
?DOC(" Write a list of generated files to a directory.\n").
-spec write_files(
list(oaspec@codegen@context:generated_file()),
binary(),
list(binary()),
fun((binary()) -> nil)
) -> {ok, list(binary())} | {error, write_error()}.
write_files(Files, Base_path, Written, On_write) ->
gleam@list:try_fold(
Files,
Written,
fun(Acc, File) ->
Full_path = <<<<Base_path/binary, "/"/utf8>>/binary,
(erlang:element(2, File))/binary>>,
gleam@result:'try'(
begin
_pipe = simplifile:write(Full_path, erlang:element(3, File)),
gleam@result:map_error(
_pipe,
fun(_) ->
{file_write_error,
Full_path,
<<"Failed to write file"/utf8>>}
end
)
end,
fun(_) ->
On_write(Full_path),
{ok, [Full_path | Acc]}
end
)
end
).
-file("src/oaspec/codegen/writer.gleam", 19).
?DOC(" Generate and write all files based on configuration.\n").
-spec generate_all(oaspec@codegen@context:context(), fun((binary()) -> nil)) -> {ok,
list(binary())} |
{error, write_error()}.
generate_all(Ctx, On_write) ->
Shared_files = generate_shared(Ctx),
Server_files = case erlang:element(6, erlang:element(3, Ctx)) of
server ->
oaspec@codegen@server:generate(Ctx);
both ->
oaspec@codegen@server:generate(Ctx);
client ->
[]
end,
Client_files = case erlang:element(6, erlang:element(3, Ctx)) of
client ->
oaspec@codegen@client:generate(Ctx);
both ->
oaspec@codegen@client:generate(Ctx);
server ->
[]
end,
Server_path = erlang:element(3, erlang:element(3, Ctx)),
Client_path = erlang:element(4, erlang:element(3, Ctx)),
Written_files = [],
gleam@result:'try'(case erlang:element(6, erlang:element(3, Ctx)) of
server ->
gleam@result:'try'(
ensure_directory(Server_path),
fun(_) ->
_pipe = write_files(
Shared_files,
Server_path,
Written_files,
On_write
),
gleam@result:'try'(
_pipe,
fun(W) ->
write_files(
Server_files,
Server_path,
W,
On_write
)
end
)
end
);
both ->
gleam@result:'try'(
ensure_directory(Server_path),
fun(_) ->
_pipe = write_files(
Shared_files,
Server_path,
Written_files,
On_write
),
gleam@result:'try'(
_pipe,
fun(W) ->
write_files(
Server_files,
Server_path,
W,
On_write
)
end
)
end
);
client ->
{ok, Written_files}
end, fun(Written_files@1) ->
gleam@result:'try'(case erlang:element(6, erlang:element(3, Ctx)) of
client ->
gleam@result:'try'(
ensure_directory(Client_path),
fun(_) ->
_pipe@1 = write_files(
Shared_files,
Client_path,
Written_files@1,
On_write
),
gleam@result:'try'(
_pipe@1,
fun(W@1) ->
write_files(
Client_files,
Client_path,
W@1,
On_write
)
end
)
end
);
both ->
gleam@result:'try'(
ensure_directory(Client_path),
fun(_) ->
_pipe@1 = write_files(
Shared_files,
Client_path,
Written_files@1,
On_write
),
gleam@result:'try'(
_pipe@1,
fun(W@1) ->
write_files(
Client_files,
Client_path,
W@1,
On_write
)
end
)
end
);
server ->
{ok, Written_files@1}
end, fun(Written_files@2) -> {ok, Written_files@2} end)
end).
-file("src/oaspec/codegen/writer.gleam", 102).
?DOC(" Convert a write error to a human-readable string.\n").
-spec error_to_string(write_error()) -> binary().
error_to_string(Error) ->
case Error of
{directory_create_error, Path, Detail} ->
<<<<<<"Failed to create directory "/utf8, Path/binary>>/binary,
": "/utf8>>/binary,
Detail/binary>>;
{file_write_error, Path@1, Detail@1} ->
<<<<<<"Failed to write file "/utf8, Path@1/binary>>/binary,
": "/utf8>>/binary,
Detail@1/binary>>
end.