<commit_before>#include "error.hh"

#include <iostream>
#include <optional>

namespace nix
{

std::optional<string> ErrorInfo::programName = std::nullopt;

string showErrPos(const ErrPos &errPos)
{
    if (errPos.column > 0) {
        return (format("(%1%:%2%)") % errPos.lineNumber % errPos.column).str();
    } else {
        return (format("(%1%)") % errPos.lineNumber).str();
    };
}

void printCodeLines(const string &prefix, const NixCode &nixCode)
{
    // previous line of code.
    if (nixCode.prevLineOfCode.has_value()) {
        std::cout << format("%1% %|2$5d|| %3%")
                  % prefix
                  % (nixCode.errPos.lineNumber - 1)
                  % *nixCode.prevLineOfCode
                  << std::endl;
    }

    // line of code containing the error.%2$+5d%
    std::cout << format("%1% %|2$5d|| %3%")
              % prefix
              % (nixCode.errPos.lineNumber)
              % nixCode.errLineOfCode
              << std::endl;

    // error arrows for the column range.
    if (nixCode.errPos.column > 0) {
        int start = nixCode.errPos.column;
        std::string spaces;
        for (int i = 0; i < start; ++i) {
            spaces.append(" ");
        }

        std::string arrows("^");

        std::cout << format("%1%      |%2%" ANSI_RED "%3%" ANSI_NORMAL) % prefix % spaces % arrows << std::endl;
    }

    // next line of code.
    if (nixCode.nextLineOfCode.has_value()) {
        std::cout << format("%1% %|2$5d|| %3%")
                  %    prefix
                  % (nixCode.errPos.lineNumber + 1)
                  % *nixCode.nextLineOfCode
                  << std::endl;
    }
}

void printErrorInfo(const ErrorInfo &einfo)
{
    int errwidth = 80;
    string prefix = "    ";

    string levelString;
    switch (einfo.level) {
    case ErrLevel::elError: {
        levelString = ANSI_RED;
        levelString += "error:";
        levelString += ANSI_NORMAL;
        break;
    }
    case ErrLevel::elWarning: {
        levelString = ANSI_YELLOW;
        levelString += "warning:";
        levelString += ANSI_NORMAL;
        break;
    }
    default: {
        levelString = (format("invalid error level: %1%") % einfo.level).str();
        break;
    }
    }

    int ndl = prefix.length() + levelString.length() + 3 + einfo.name.length() + einfo.programName.value_or("").length();
    int dashwidth = ndl > (errwidth - 3) ? 3 : errwidth - ndl;

    string dashes;
    for (int i = 0; i < dashwidth; ++i)
        dashes.append("-");

    // divider.
    std::cout << format("%1%%2%" ANSI_BLUE " %3% %4% %5% %6%" ANSI_NORMAL)
              % prefix
              % levelString
              % "---"
              % einfo.name
              % dashes
              % einfo.programName.value_or("")
              << std::endl;

    // filename.
    if (einfo.nixCode.has_value()) {
        if (einfo.nixCode->errPos.nixFile != "") {
            string eline = einfo.nixCode->errLineOfCode != ""
                           ? string(" ") + showErrPos(einfo.nixCode->errPos)
                           : "";

            std::cout << format("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL)
                      % prefix % einfo.nixCode->errPos.nixFile % eline << std::endl;
            std::cout << prefix << std::endl;
        } else {
            std::cout << format("%1%from command line argument") % prefix << std::endl;
            std::cout << prefix << std::endl;
        }
    }

    // description
    std::cout << prefix << einfo.description << std::endl;
    std::cout << prefix << std::endl;

    // lines of code.
    if (einfo.nixCode->errLineOfCode != "") {
        printCodeLines(prefix, *einfo.nixCode);
        std::cout << prefix << std::endl;
    }

    // hint
    if (einfo.hint.has_value()) {
        std::cout << prefix << *einfo.hint << std::endl;
        std::cout << prefix << std::endl;
    }
}

}
<commit_msg>format -> fmt<commit_after>#include "error.hh"

#include <iostream>
#include <optional>

namespace nix
{

std::optional<string> ErrorInfo::programName = std::nullopt;

string showErrPos(const ErrPos &errPos)
{
    if (errPos.column > 0) {
        return fmt("(%1%:%2%)", errPos.lineNumber, errPos.column);
    } else {
        return fmt("(%1%)", errPos.lineNumber);
    };
}

void printCodeLines(const string &prefix, const NixCode &nixCode)
{
    // previous line of code.
    if (nixCode.prevLineOfCode.has_value()) {
        std::cout << fmt("%1% %|2$5d|| %3%",
                         prefix,
                         (nixCode.errPos.lineNumber - 1),
                         *nixCode.prevLineOfCode)
                  << std::endl;
    }

    // line of code containing the error.%2$+5d%
    std::cout << fmt("%1% %|2$5d|| %3%",
                     prefix,
                     (nixCode.errPos.lineNumber),
                     nixCode.errLineOfCode)
              << std::endl;

    // error arrows for the column range.
    if (nixCode.errPos.column > 0) {
        int start = nixCode.errPos.column;
        std::string spaces;
        for (int i = 0; i < start; ++i) {
            spaces.append(" ");
        }

        std::string arrows("^");

        std::cout << fmt("%1%      |%2%" ANSI_RED "%3%" ANSI_NORMAL,
                         prefix,
                         spaces,
                         arrows) << std::endl;
    }

    // next line of code.
    if (nixCode.nextLineOfCode.has_value()) {
        std::cout << fmt("%1% %|2$5d|| %3%",
                         prefix,
                         (nixCode.errPos.lineNumber + 1),
                         *nixCode.nextLineOfCode)
                  << std::endl;
    }
}

void printErrorInfo(const ErrorInfo &einfo)
{
    int errwidth = 80;
    string prefix = "    ";

    string levelString;
    switch (einfo.level) {
    case ErrLevel::elError: {
        levelString = ANSI_RED;
        levelString += "error:";
        levelString += ANSI_NORMAL;
        break;
    }
    case ErrLevel::elWarning: {
        levelString = ANSI_YELLOW;
        levelString += "warning:";
        levelString += ANSI_NORMAL;
        break;
    }
    default: {
        levelString = fmt("invalid error level: %1%", einfo.level);
                       break;
    }
    }

    int ndl = prefix.length() + levelString.length() + 3 + einfo.name.length() + einfo.programName.value_or("").length();
    int dashwidth = ndl > (errwidth - 3) ? 3 : errwidth - ndl;

    string dashes;
    for (int i = 0; i < dashwidth; ++i)
        dashes.append("-");

    // divider.
    std::cout << fmt("%1%%2%" ANSI_BLUE " %3% %4% %5% %6%" ANSI_NORMAL,
                     prefix,
                     levelString,
                     "---",
                     einfo.name,
                     dashes,
                     einfo.programName.value_or(""))
              << std::endl;

    // filename.
    if (einfo.nixCode.has_value()) {
        if (einfo.nixCode->errPos.nixFile != "") {
            string eline = einfo.nixCode->errLineOfCode != ""
                           ? string(" ") + showErrPos(einfo.nixCode->errPos)
                           : "";

            std::cout << fmt("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL
                             , prefix, einfo.nixCode->errPos.nixFile, eline) << std::endl;
            std::cout << prefix << std::endl;
        } else {
            std::cout << fmt("%1%from command line argument", prefix) << std::endl;
            std::cout << prefix << std::endl;
        }
    }

    // description
    std::cout << prefix << einfo.description << std::endl;
    std::cout << prefix << std::endl;

    // lines of code.
    if (einfo.nixCode->errLineOfCode != "") {
        printCodeLines(prefix, *einfo.nixCode);
        std::cout << prefix << std::endl;
    }

    // hint
    if (einfo.hint.has_value()) {
        std::cout << prefix << *einfo.hint << std::endl;
        std::cout << prefix << std::endl;
    }
}

}

{'fraction_non_alphanumeric': 0.15896464646464648, 'fraction_numerical': 0.010606060606060607, 'mean_word_length': 1.7229288415262978, 'pattern_counts': {'":': 0, '<': 133, '<?xml version=': 0, '>': 26, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4361518', 'n_tokens_mistral': 2590, 'n_tokens_neox': 2464, 'n_words': 505}