Current section
Files
Jump to
Current section
Files
src/drip@internal@cli.erl
-module(drip@internal@cli).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/drip/internal/cli.gleam").
-export([run/2]).
-export_type([vendored/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.
?MODULEDOC(false).
-type vendored() :: {vendored, binary(), list(binary())}.
-file("src/drip/internal/cli.gleam", 311).
?DOC(false).
-spec surfaced(
drip@internal@project:file_change(),
drip@internal@project:overwrite()
) -> list(drip@internal@project:file_change()).
surfaced(Change, Overwrite) ->
case Change of
{unmodified, _} ->
case Overwrite of
force ->
[Change];
preserve ->
[]
end;
{created, _} ->
[Change];
{modified, _} ->
[Change];
{deleted, _} ->
[Change]
end.
-file("src/drip/internal/cli.gleam", 103).
?DOC(false).
-spec list_elements(
drip@internal@project:project(),
list(drip@internal@registry:element())
) -> {ok, list(drip@internal@render:entry())} |
{error, drip@internal@error:error()}.
list_elements(Project, Registry) ->
gleam@result:map(
drip@internal@project:vendored_filenames(Project),
fun(Filenames) ->
gleam@list:map(
Registry,
fun(Element) ->
{entry,
erlang:element(2, Element),
drip@internal@project:vendored_in(
Filenames,
erlang:element(2, Element)
)}
end
)
end
).
-file("src/drip/internal/cli.gleam", 89).
?DOC(false).
-spec list(drip@internal@project:project()) -> glint:command({ok, binary()} |
{error, drip@internal@error:error()}).
list(Project) ->
glint:command_help(
<<"List the elements available in the source registry."/utf8>>,
fun() ->
glint:unnamed_args(
{eq_args, 0},
fun() ->
glint:command(
fun(_, _, _) ->
gleam@result:'try'(
drip@internal@registry:fetch(
drip@internal@project:source(Project)
),
fun(Registry) ->
gleam@result:'try'(
list_elements(Project, Registry),
fun(Entries) ->
{ok,
drip@internal@render:list_summary(
Entries
)}
end
)
end
)
end
)
end
)
end
).
-file("src/drip/internal/cli.gleam", 269).
?DOC(false).
-spec partition_removable(drip@internal@project:project(), list(binary())) -> {ok,
{list(vendored()), list(binary())}} |
{error, drip@internal@error:error()}.
partition_removable(Project, Names) ->
gleam@result:map(
gleam@list:try_fold(
Names,
{[], []},
fun(Acc, Name) ->
{Vendored, Absent} = Acc,
gleam@result:map(
drip@internal@project:vendored_files(Project, Name),
fun(Files) -> case Files of
[] ->
{Vendored, [Name | Absent]};
_ ->
{[{vendored, Name, Files} | Vendored], Absent}
end end
)
end
),
fun(_use0) ->
{Vendored@1, Absent@1} = _use0,
{gleam@list:sort(
Vendored@1,
fun(A, B) ->
gleam@string:compare(
erlang:element(2, A),
erlang:element(2, B)
)
end
),
gleam@list:sort(Absent@1, fun gleam@string:compare/2)}
end
).
-file("src/drip/internal/cli.gleam", 291).
?DOC(false).
-spec require_elements(binary(), list(binary())) -> {ok, list(binary())} |
{error, drip@internal@error:error()}.
require_elements(Command, Names) ->
case Names of
[] ->
{error, {no_elements_requested, Command}};
_ ->
{ok, gleam@list:unique(Names)}
end.
-file("src/drip/internal/cli.gleam", 232).
?DOC(false).
-spec remove(drip@internal@project:project()) -> glint:command({ok, binary()} |
{error, drip@internal@error:error()}).
remove(Project) ->
glint:command_help(
<<"Remove vendored elements and their files from your project."/utf8>>,
fun() ->
glint:unnamed_args(
{min_args, 0},
fun() ->
glint:command(
fun(_, Element_names, _) ->
gleam@result:'try'(
require_elements(
<<"remove"/utf8>>,
Element_names
),
fun(Element_names@1) ->
gleam@result:'try'(
drip@internal@project:ensure_initialized(
Project
),
fun(_) ->
gleam@result:'try'(
partition_removable(
Project,
Element_names@1
),
fun(_use0) ->
{Vendored, Absent} = _use0,
Files = gleam@list:flat_map(
Vendored,
fun(Element) ->
erlang:element(
3,
Element
)
end
),
gleam@result:'try'(
drip@internal@project:delete_files(
Files
),
fun(File_changes) ->
gleam@result:'try'(
drip@internal@project:rewrite_index_css(
Project
),
fun(
Index_change
) ->
{ok,
drip@internal@render:remove_summary(
Project,
gleam@list:map(
Vendored,
fun(
Element@1
) ->
erlang:element(
2,
Element@1
)
end
),
Absent,
lists:append(
File_changes,
surfaced(
Index_change,
preserve
)
)
)}
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/drip/internal/cli.gleam", 213).
?DOC(false).
-spec rewrite_imports(binary(), binary()) -> binary().
rewrite_imports(Prefix, Source) ->
_pipe = gleam@string:split(Source, <<"\n"/utf8>>),
_pipe@1 = gleam@list:map(
_pipe,
fun(Line) ->
case gleam_stdlib:string_starts_with(Line, <<"import ui/"/utf8>>) of
true ->
<<<<<<"import "/utf8, Prefix/binary>>/binary, "/"/utf8>>/binary,
(gleam@string:drop_start(
Line,
string:length(<<"import ui/"/utf8>>)
))/binary>>;
false ->
Line
end
end
),
gleam@string:join(_pipe@1, <<"\n"/utf8>>).
-file("src/drip/internal/cli.gleam", 196).
?DOC(false).
-spec fetch_element_files(
drip@internal@project:project(),
drip@internal@registry:element()
) -> {ok, list({binary(), binary()})} | {error, drip@internal@error:error()}.
fetch_element_files(Project, Element) ->
Prefix = drip@internal@project:prefix(Project),
gleam@list:try_map(
erlang:element(5, Element),
fun(Filename) ->
gleam@result:map(
drip@internal@source:fetch(
drip@internal@project:source(Project),
Filename
),
fun(Body) ->
Body@1 = case gleam_stdlib:string_ends_with(
Filename,
<<".gleam"/utf8>>
) of
true ->
rewrite_imports(Prefix, Body);
false ->
Body
end,
{drip@internal@project:file_path(Project, Filename), Body@1}
end
)
end
).
-file("src/drip/internal/cli.gleam", 186).
?DOC(false).
-spec fetch_elements(
drip@internal@project:project(),
list(drip@internal@registry:element())
) -> {ok, list({binary(), binary()})} | {error, drip@internal@error:error()}.
fetch_elements(Project, Elements) ->
gleam@result:map(
gleam@list:try_map(
Elements,
fun(Element) -> fetch_element_files(Project, Element) end
),
fun(Nested) -> lists:append(Nested) end
).
-file("src/drip/internal/cli.gleam", 322).
?DOC(false).
-spec sort_by_name(list(drip@internal@registry:element())) -> list(drip@internal@registry:element()).
sort_by_name(Elements) ->
gleam@list:sort(
Elements,
fun(A, B) ->
gleam@string:compare(erlang:element(2, A), erlang:element(2, B))
end
).
-file("src/drip/internal/cli.gleam", 166).
?DOC(false).
-spec partition_vendored(
drip@internal@project:project(),
list(drip@internal@registry:element()),
drip@internal@project:overwrite()
) -> {ok,
{list(drip@internal@registry:element()),
list(drip@internal@registry:element())}} |
{error, drip@internal@error:error()}.
partition_vendored(Project, Elements, Overwrite) ->
gleam@result:map(case Overwrite of
force ->
{ok, {Elements, []}};
preserve ->
gleam@list:try_fold(
Elements,
{[], []},
fun(Acc, Element) ->
{To_vendor, Already_vendored} = Acc,
gleam@result:map(
drip@internal@project:is_vendored(
Project,
erlang:element(2, Element)
),
fun(Present) -> case Present of
true ->
{To_vendor,
[Element | Already_vendored]};
false ->
{[Element | To_vendor],
Already_vendored}
end end
)
end
)
end, fun(_use0) ->
{To_vendor@1, Already_vendored@1} = _use0,
{sort_by_name(To_vendor@1), sort_by_name(Already_vendored@1)}
end).
-file("src/drip/internal/cli.gleam", 302).
?DOC(false).
-spec to_overwrite(boolean()) -> drip@internal@project:overwrite().
to_overwrite(Force) ->
case Force of
true ->
force;
false ->
preserve
end.
-file("src/drip/internal/cli.gleam", 118).
?DOC(false).
-spec add(drip@internal@project:project()) -> glint:command({ok, binary()} |
{error, drip@internal@error:error()}).
add(Project) ->
glint:command_help(
<<"Vendor elements and their dependencies into your project."/utf8>>,
fun() ->
glint:flag(
begin
_pipe = glint:bool_flag(<<"force"/utf8>>),
_pipe@1 = glint:flag_default(_pipe, false),
glint:flag_help(
_pipe@1,
<<"Re-vendor the resolved elements, overwriting files already on disk."/utf8>>
)
end,
fun(Force) ->
glint:unnamed_args(
{min_args, 0},
fun() ->
glint:command(
fun(_, Element_names, Flags) ->
Overwrite = to_overwrite(
begin
_pipe@2 = Force(Flags),
gleam@result:unwrap(_pipe@2, false)
end
),
gleam@result:'try'(
require_elements(
<<"add"/utf8>>,
Element_names
),
fun(Element_names@1) ->
gleam@result:'try'(
drip@internal@project:ensure_initialized(
Project
),
fun(_) ->
gleam@result:'try'(
drip@internal@registry:fetch(
drip@internal@project:source(
Project
)
),
fun(Registry) ->
gleam@result:'try'(
drip@internal@registry:resolve_elements(
Registry,
Element_names@1
),
fun(Elements) ->
gleam@result:'try'(
partition_vendored(
Project,
Elements,
Overwrite
),
fun(
_use0
) ->
{To_vendor,
Already_vendored} = _use0,
gleam@result:'try'(
fetch_elements(
Project,
To_vendor
),
fun(
Element_files
) ->
gleam@result:'try'(
drip@internal@project:write_changes(
Element_files
),
fun(
File_changes
) ->
gleam@result:'try'(
drip@internal@project:rewrite_index_css(
Project
),
fun(
Index_css_change
) ->
{ok,
drip@internal@render:add_summary(
Project,
To_vendor,
Already_vendored,
lists:append(
File_changes,
surfaced(
Index_css_change,
Overwrite
)
)
)}
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/drip/internal/cli.gleam", 34).
?DOC(false).
-spec init(drip@internal@project:project()) -> glint:command({ok, binary()} |
{error, drip@internal@error:error()}).
init(Project) ->
glint:command_help(
<<"Scaffold the theme, index, and entry stylesheets."/utf8>>,
fun() ->
glint:flag(
begin
_pipe = glint:string_flag(<<"prefix"/utf8>>),
glint:flag_help(
_pipe,
<<"Directory under src/ that elements vendor into, recorded in gleam.toml's"/utf8,
" [tools.drip] table (default: ui)."/utf8>>
)
end,
fun(Prefix) ->
glint:flag(
begin
_pipe@1 = glint:string_flag(<<"source"/utf8>>),
glint:flag_help(
_pipe@1,
<<"Registry to vendor from, a URL or local path, recorded in gleam.toml's"/utf8,
" [tools.drip] table (default: the latest GitHub release)."/utf8>>
)
end,
fun(Source) ->
glint:flag(
begin
_pipe@2 = glint:bool_flag(<<"force"/utf8>>),
_pipe@3 = glint:flag_default(_pipe@2, false),
glint:flag_help(
_pipe@3,
<<"Overwrite the scaffolded stylesheets when they already exist."/utf8>>
)
end,
fun(Force) ->
glint:unnamed_args(
{eq_args, 0},
fun() ->
glint:command(
fun(_, _, Flags) ->
Overwrite = to_overwrite(
begin
_pipe@4 = Force(
Flags
),
gleam@result:unwrap(
_pipe@4,
false
)
end
),
Prefix_override = gleam@option:from_result(
Prefix(Flags)
),
Source_override = gleam@option:from_result(
Source(Flags)
),
gleam@result:'try'(
drip@internal@project:with_overrides(
Project,
Prefix_override,
Source_override
),
fun(Project@1) ->
gleam@result:'try'(
drip@internal@project:scaffold(
Project@1,
Overwrite
),
fun(Changes) ->
gleam@result:'try'(
drip@internal@project:write_settings(
Project@1,
Prefix_override,
Source_override
),
fun(
Toml_changes
) ->
{ok,
drip@internal@render:init_summary(
Project@1,
lists:append(
Changes,
Toml_changes
)
)}
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/drip/internal/cli.gleam", 14).
?DOC(false).
-spec run(drip@internal@project:project(), list(binary())) -> {ok, binary()} |
{error, drip@internal@error:error()}.
run(Project, Args) ->
Cli = begin
_pipe = glint:new(),
_pipe@1 = glint:as_module(_pipe),
_pipe@2 = glint:with_name(_pipe@1, <<"drip"/utf8>>),
_pipe@3 = glint:add(_pipe@2, [<<"init"/utf8>>], init(Project)),
_pipe@4 = glint:add(_pipe@3, [<<"list"/utf8>>], list(Project)),
_pipe@5 = glint:add(_pipe@4, [<<"add"/utf8>>], add(Project)),
glint:add(_pipe@5, [<<"remove"/utf8>>], remove(Project))
end,
case glint:execute(Cli, Args) of
{ok, {help, Help}} ->
{ok, Help};
{ok, {out, {ok, Output}}} ->
{ok, Output};
{ok, {out, {error, Cause}}} ->
{error, Cause};
{error, Message} ->
{error, {invalid_usage, Message}}
end.