From 61eea92fe08f4e01f1a090a281fe7ce25ca9e5f2 Mon Sep 17 00:00:00 2001 From: Ponali Date: Sat, 18 Oct 2025 11:25:38 +0200 Subject: [PATCH] the lua shell now catches errors dealt by libraries, and puts them on a log file there's also lazyvim formatting everything, as usual --- halyde/apps/lua.lua | 50 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/halyde/apps/lua.lua b/halyde/apps/lua.lua index b5a6710..b0f7eb5 100644 --- a/halyde/apps/lua.lua +++ b/halyde/apps/lua.lua @@ -1,29 +1,61 @@ -- terminal.readHistory["lua"] = {""} local fs = require("filesystem") local computer = require("computer") +local log = require("log") local bootTime = computer.uptime() local libList = fs.list("/lib/") +local failed = false for _, lib in pairs(libList) do - if lib:match("(.+)%.lua") then - local name = lib:match("(.+)%.lua") - _G[name] = require(name) + local status, err = xpcall(function() + if lib:match("(.+)%.lua") then + local name = lib:match("(.+)%.lua") + _G[name] = require(name) + end + end, debug.traceback) + if not status then + print( + string.format( + "\x1b[91mLibrary %s has failed loading:\n │ %s", + lib:match("(.+)%.lua"), + tostring(err or "unknown error"):match("^(.-)\n") + ) + ) -- TODO: only show first line of error + log.lua.error( + string.format( + 'The library located at "%s" has failed loading:\n%s', + lib, + type(err) ~= "nil" and tostring(err) or "unknown error" + ) + ) + failed = true end end -print(string.format("\27[37mLoaded %d libraries in %.2f seconds\27[0m",#libList,computer.uptime()-bootTime)) -print(string.format("\27[44m%s\27[0m shell",_VERSION)) +if failed then + print( + string.format( + '\x1b[93mOne or more libraries failed to load. For more information, check the log entries located at "%s".', + tostring(log.lua.logpath or "[unknown]") + ) + ) +end + +print(string.format("\27[37mLoaded %d libraries in %.2f seconds\27[0m", #libList, computer.uptime() - bootTime)) +print(string.format("\27[44m%s\27[0m shell", _VERSION)) print('Type "exit" to exit.') while true do local command = terminal.read("lua", "\27[44mlua>\27[0m ") if command == "exit" then return - elseif command~="" then + elseif command ~= "" then local function runCommand() - local func = load("return "..command,"=stdin") or load(command,"=stdin") - local res = {assert(func)()} - if res and (type(res[1])~="nil" or type(res[2])~="nil") then print(table.unpack(res)) end + local func = load("return " .. command, "=stdin") or load(command, "=stdin") + local res = { assert(func)() } + if res and (type(res[1]) ~= "nil" or type(res[2]) ~= "nil") then + print(table.unpack(res)) + end end local result, reason = xpcall(runCommand, function(errMsg) return errMsg .. "\n\n" .. debug.traceback()