Current section

Files

Jump to
oaspec src oaspec.erl
Raw

src/oaspec.erl

-module(oaspec).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/oaspec.gleam").
-export([normalize_argv/1, main/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.
-file("src/oaspec.gleam", 25).
-spec run_glint(list(binary())) -> nil.
run_glint(Arguments) ->
case glint:execute(oaspec@cli:app(), Arguments) of
{error, Message} ->
gleam_stdlib:println_error(Message),
erlang:halt(1);
{ok, {help, Text}} ->
gleam_stdlib:println(Text);
{ok, {out, _}} ->
nil
end.
-file("src/oaspec.gleam", 67).
-spec is_value_long_flag(binary()) -> boolean().
is_value_long_flag(Arg) ->
gleam@bool:guard(
not gleam_stdlib:string_starts_with(Arg, <<"--"/utf8>>),
false,
fun() ->
Name = gleam@string:drop_start(Arg, 2),
gleam@list:contains(
[<<"config"/utf8>>, <<"mode"/utf8>>, <<"output"/utf8>>],
Name
)
end
).
-file("src/oaspec.gleam", 73).
-spec value_is_value(binary()) -> boolean().
value_is_value(Arg) ->
not gleam_stdlib:string_starts_with(Arg, <<"-"/utf8>>).
-file("src/oaspec.gleam", 53).
-spec do_normalize(list(binary()), list(binary())) -> list(binary()).
do_normalize(Arguments, Acc) ->
case Arguments of
[] ->
lists:reverse(Acc);
[Arg, Value | Rest] ->
gleam@bool:lazy_guard(
not (is_value_long_flag(Arg) andalso value_is_value(Value)),
fun() -> do_normalize([Value | Rest], [Arg | Acc]) end,
fun() ->
do_normalize(
Rest,
[<<<<Arg/binary, "="/utf8>>/binary, Value/binary>> |
Acc]
)
end
);
[Single | Rest@1] ->
do_normalize(Rest@1, [Single | Acc])
end.
-file("src/oaspec.gleam", 49).
?DOC(
" Translate `--name value` into `--name=value` for the value-bearing long\n"
" options listed in `cli.value_flag_names`. glint 1.x only accepts the\n"
" `=`-joined form, so users who reach for the GNU `--name value` convention\n"
" (or who copy commands from `git`/`gh`/`cargo` muscle memory) hit\n"
" `invalid flag '<name>'`. The normalisation happens before glint sees the\n"
" argv so existing `--name=value` callers are unaffected, and so unknown\n"
" flags still surface from glint with their original error.\n"
"\n"
" Other shapes are passed through untouched:\n"
" - `--name=value`: already canonical (the name has `=` in it, so no match)\n"
" - `--bool-flag`: not in the value-bearing list\n"
" - `--name -other`: a `-`-prefixed value is treated as the next flag, so\n"
" the original (broken) call is preserved and glint reports it as before\n"
).
-spec normalize_argv(list(binary())) -> list(binary()).
normalize_argv(Arguments) ->
do_normalize(Arguments, []).
-file("src/oaspec.gleam", 17).
?DOC(
" CLI entry point for the oaspec code generator.\n"
"\n"
" Routes diagnostic output to stderr while keeping requested output (such as\n"
" `--help` text) on stdout, following POSIX/CLIG conventions.\n"
).
-spec main() -> nil.
main() ->
Arguments = erlang:element(4, argv:load()),
case Arguments of
[<<"--version"/utf8>> | _] ->
gleam_stdlib:println(
<<"oaspec v"/utf8, (<<"0.22.0"/utf8>>)/binary>>
);
_ ->
run_glint(normalize_argv(Arguments))
end.