-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.