-module(go_over). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([main/0]). -export_type([flags/0]). -type flags() :: {flags, boolean(), boolean(), boolean()}. -spec spin_up() -> flags(). spin_up() -> _assert_subject = go_over@yaml:start(), {ok, _} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"go_over"/utf8>>, function => <<"spin_up"/utf8>>, line => 21}) end, Args = shellout_ffi:start_arguments(), Flags = {flags, gleam@list:any(Args, fun(Arg) -> Arg =:= <<"--skip"/utf8>> end), gleam@list:any(Args, fun(Arg@1) -> Arg@1 =:= <<"--force"/utf8>> end), gleam@list:any(Args, fun(Arg@2) -> Arg@2 =:= <<"--fake"/utf8>> end)}, go_over@util:iffnil( erlang:element(3, Flags) andalso erlang:element(2, Flags), fun() -> _pipe = shellout:style( <<"Cannot specify both `--skip` & `--force`\n\n"/utf8>>, shellout:color([<<"red"/utf8>>]), [] ), gleam@io:print(_pipe), shellout_ffi:os_exit(1) end ), Flags. -spec get_vulnerable_packages(list(go_over@packages:package()), flags()) -> list(go_over@warning:warning()). get_vulnerable_packages(Pkgs, Flags) -> _pipe = go_over@advisories:check_for_advisories( Pkgs, not erlang:element(2, Flags) ), gleam@list:map( _pipe, fun(P) -> {Pkg, Adv} = P, go_over@warning:adv_to_warning(Pkg, Adv) end ). -spec get_retired_packges(list(go_over@packages:package()), flags()) -> list(go_over@warning:warning()). get_retired_packges(Pkgs, Flags) -> _pipe = Pkgs, _pipe@1 = gleam@list:map( _pipe, fun(Pkg) -> case go_over@retired:check_retired( Pkg, not erlang:element(2, Flags) ) of {some, Ret} -> {some, {Pkg, Ret}}; none -> none end end ), _pipe@2 = gleam@option:values(_pipe@1), gleam@list:map( _pipe@2, fun(P) -> {Pkg@1, Ret@1} = P, go_over@warning:retired_to_warning(Pkg@1, Ret@1) end ). -spec print_warnings(list(go_over@warning:warning())) -> nil. print_warnings(Vulns) -> Len = erlang:length(Vulns), _pipe = (<<<<<<"⛔ "/utf8, (gleam@int:to_string(Len))/binary>>/binary, " WARNING(s) FOUND!"/utf8>>/binary, (<<"\n-----------------------------------------------\n"/utf8>>)/binary>>), gleam@io:print(_pipe), Warn = begin _pipe@1 = Vulns, _pipe@2 = gleam@list:map( _pipe@1, fun(W) -> shellout:style( go_over@warning:print(W), shellout:color([<<"red"/utf8>>]), [] ) end ), gleam@string:join( _pipe@2, <<"\n-----------------------------------------------\n"/utf8>> ) end, gleam@io:print_error(<>), shellout_ffi:os_exit(1). -spec main() -> nil. main() -> Flags = spin_up(), go_over@util:throwaway( erlang:element(3, Flags), fun() -> simplifile:delete(go_over@constants:go_over_path()) end ), go_over@util:iffnil( erlang:element(4, Flags), fun() -> print_warnings( [{warning, <<"Fake Retired Package"/utf8>>, <<"0.1.2"/utf8>>, <<"Retired"/utf8>>, retired, direct}, {warning, <<"Fake Vulnerable Package"/utf8>>, <<"1.2.3"/utf8>>, <<"Vulnerabe"/utf8>>, vulnerable, indirect}] ) end ), Pkgs = go_over@packages:read_manifest(<<"./manifest.toml"/utf8>>), Vulnerable_packages = get_vulnerable_packages(Pkgs, Flags), Retired_packages = get_retired_packges(Pkgs, Flags), case lists:append(Retired_packages, Vulnerable_packages) of [] -> _pipe = shellout:style( <<"✅ All good! ✨\n\n"/utf8>>, shellout:color([<<"brightgreen"/utf8>>]), [] ), gleam@io:print(_pipe); Vulns -> print_warnings(Vulns) end.