src/safe_errors.erl

-module(safe_errors).

%% All user-facing error formatting for the safe plugin.

-export([format_error/1]).

-spec format_error(term()) -> io_lib:chars().
format_error({fingerprint_failed, ExitCode}) ->
    io_lib:format(
        "SAFE fingerprint failed with exit code ~B.~nCheck the output above for details.",
        [ExitCode]
    );
format_error(vulnerabilities_found) ->
    "SAFE analysis complete - vulnerabilities found. Review the output above.";
format_error({analyse_failed, _ExitCode}) ->
    io_lib:format("SAFE analysis failed.~nCheck the output above for details.", []);
format_error({checksum_mismatch, _}) ->
    "Downloaded file is corrupted (checksum mismatch). Please try again.";
format_error({no_checksum_for_platform, Platform}) ->
    io_lib:format("No checksum available for platform ~s", [Platform]);
format_error({download_failed, Url, Reason}) ->
    io_lib:format(
        "Failed to download SAFE from ~s~nReason: ~p~nCheck your internet "
        "connection and try again.",
        [Url, Reason]
    );
format_error({write_error, Reason}) ->
    io_lib:format(
        "Failed to write downloaded file~nReason: ~p~nCheck disk space and permissions.",
        [Reason]
    );
format_error({http_error, 404, _}) ->
    "SAFE version not found. Check version and try again.";
format_error({http_error, Code, Reason}) ->
    io_lib:format("HTTP error ~p: ~s", [Code, Reason]);
format_error(unsupported_platform) ->
    io_lib:format(
        "Unsupported platform: ~p~nSAFE currently supports Linux and macOS only.",
        [os:type()]
    );
format_error({manifest_fetch_failed, {request_failed, Reason}}) ->
    io_lib:format(
        "Failed to fetch SAFE versions manifest~nReason: ~p~nCheck your internet connection and firewall settings.",
        [Reason]
    );
format_error({manifest_fetch_failed, Reason}) ->
    io_lib:format(
        "Failed to fetch SAFE versions manifest~nReason: ~p",
        [Reason]
    );
format_error(no_compatible_version) ->
    "No compatible SAFE version found. Check version requirement and try again.";
format_error({app_file_outside_project, Path, ProjectDir}) ->
    io_lib:format(
        "App file is outside project directory~n  App file: ~s~n  Project "
        "root: ~s~nThis usually indicates a misconfigured project structure.",
        [Path, ProjectDir]
    );
format_error({invalid_checksums, _Checksums}) ->
    "Invalid checksums format. Contact support.";
format_error({config_read_error, Reason}) ->
    io_lib:format(
        "Failed to read .safe/config.json: ~p~nCheck file permissions.",
        [Reason]
    );
format_error({config_write_error, Reason}) ->
    io_lib:format(
        "Failed to write .safe/config.json: ~p~nCheck disk space and permissions.",
        [Reason]
    );
format_error({version_failed, ExitCode}) ->
    io_lib:format(
        "SAFE version command failed with exit code ~B.~nCheck the output above for details.",
        [ExitCode]
    );
format_error({untar_failed, Reason}) ->
    io_lib:format(
        "Failed to extract SAFE archive.~nReason: ~p~nThe download may be corrupted; try again.",
        [Reason]
    );
format_error(Reason) ->
    io_lib:format("Unknown error: ~p", [Reason]).