Zepha/src/lua/ErrorFormatter.cpp

63 lines
1.7 KiB
C++

//
// Created by aurailus on 2020-02-11.
//
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>
#include "ErrorFormatter.h"
std::string ErrorFormatter::formatError(const string& fileName, usize line,
const string& stack, string file, bool ansiColors) noexcept {
const string RED = "`cf";
const string LTGRAY = "`c1";
const string GRAY = "`c2";
const string BOLD = "`b";
const string UNDL = "`u";
const string ENDL = "`r\n";
std::stringstream out {};
out << BOLD << UNDL << fileName << ".lua" << ENDL << "\n";
vec<string> fileLines {};
usize pos = 0;
string token;
while ((pos = file.find("\n")) != string::npos) {
token = file.substr(0, pos);
fileLines.push_back(token);
file.erase(0, pos + 1);
}
fileLines.push_back(file);
while (fileLines.back() == "") fileLines.pop_back();
usize printStart = (std::max)(0, static_cast<i32>(line - LOOK_AROUND - 1));
usize printEnd = (std::min)(fileLines.size(), line + LOOK_AROUND);
if (printStart != 0) {
for (usize j = 0; j < 3 - std::to_string(printStart).length(); j++) out << " ` ` ";
out << GRAY << printStart << " | -- snip --" << ENDL;
}
for (i32 i = printStart; i < printEnd; i++) {
for (usize j = 0; j < 3 - std::to_string(i + 1).length(); j++) out << " ` ` ";
out << (i + 1 == line ? RED : LTGRAY) << (i + 1)
<< (i + 1 == line ? "" : "`cr")
<< " | " << (i + 1 == line ? BOLD : "")
<< fileLines[i] << ENDL;
}
if (printEnd != fileLines.size()) {
for (usize j = 0; j < 3 - std::to_string(printEnd + 1).length(); j++) out << " ` ` ";
out << GRAY << (printEnd + 1) << " | -- snip --" << ENDL;
}
out << "\n" << BOLD << UNDL << "Traceback" << ENDL << "\n" << RED << stack << ENDL;
return out.str();
}