Files
Basalt2/docs/references/errorManager.md
2025-02-16 14:12:49 +00:00

3.3 KiB

local LOGGER = require("log")

local errorHandler = { tracebackEnabled = true, header = "Basalt Error" }

local function coloredPrint(message, color) term.setTextColor(color) print(message) term.setTextColor(colors.white) end

function errorHandler.error(errMsg) if errorHandler.errorHandled then error() end term.setBackgroundColor(colors.black)

term.clear()
term.setCursorPos(1, 1)

coloredPrint(errorHandler.header..":", colors.red)
print()

local level = 2
local topInfo
while true do
    local info = debug.getinfo(level, "Sl")
    if not info then break end
    topInfo = info
    level = level + 1
end
local info = topInfo or debug.getinfo(2, "Sl")
local fileName = info.source:sub(2)
local lineNumber = info.currentline
local errorMessage = errMsg

    if(errorHandler.tracebackEnabled)then
        local stackTrace = debug.traceback()
        if stackTrace then
            --coloredPrint("Stack traceback:", colors.gray)
            for line in stackTrace:gmatch("[^\r\n]+") do
                local fileNameInTraceback, lineNumberInTraceback = line:match("([^:]+):(%d+):")
                if fileNameInTraceback and lineNumberInTraceback then
                    term.setTextColor(colors.lightGray)
                    term.write(fileNameInTraceback)
                    term.setTextColor(colors.gray)
                    term.write(":")
                    term.setTextColor(colors.lightBlue)
                    term.write(lineNumberInTraceback)
                    term.setTextColor(colors.gray)
                    line = line:gsub(fileNameInTraceback .. ":" .. lineNumberInTraceback, "")
                end
                coloredPrint(line, colors.gray)
            end
            print()
        end
    end

if fileName and lineNumber then
    term.setTextColor(colors.red)
    term.write("Error in ")
    term.setTextColor(colors.white)
    term.write(fileName)
    term.setTextColor(colors.red)
    term.write(":")
    term.setTextColor(colors.lightBlue)
    term.write(lineNumber)
    term.setTextColor(colors.red)
    term.write(": ")


    if errorMessage then
        errorMessage = string.gsub(errorMessage, "stack traceback:.*", "")
        if errorMessage ~= "" then
            coloredPrint(errorMessage, colors.red)
        else
            coloredPrint("Error message not available", colors.gray)
        end
    else
        coloredPrint("Error message not available", colors.gray)
    end

    local file = fs.open(fileName, "r")
    if file then
        local lineContent = ""
        local currentLineNumber = 1
        repeat
            lineContent = file.readLine()
            if currentLineNumber == tonumber(lineNumber) then
                coloredPrint("\149Line " .. lineNumber, colors.cyan)
                coloredPrint(lineContent, colors.lightGray)
                break
            end
            currentLineNumber = currentLineNumber + 1
        until not lineContent
        file.close()
    end
end

term.setBackgroundColor(colors.black)
LOGGER.error(errMsg)
errorHandler.errorHandled = true
error()

end

return errorHandler