diff --git a/halyde/apps/argentum.lua b/halyde/apps/argentum.lua index e3ed00e..554102b 100644 --- a/halyde/apps/argentum.lua +++ b/halyde/apps/argentum.lua @@ -107,7 +107,7 @@ local function doChecks(package) if agcfg[package].dependencies then for _, dependency in ipairs(agcfg[package].dependencies) do if not agReg[dependency] and not agcfg[dependency] then - local response = terminal.read(nil, "\27[91mPackage " .. package .. " requires dependency " .. dependency .. " that does not exist.\n[A - Abort/s - Skip]") + local response = terminal.read({prefix = "\27[91mPackage " .. package .. " requires dependency " .. dependency .. " that does not exist.\n[A - Abort/s - Skip]"}) if response:lower() ~= "s" then fs.remove("/argentum/store/" .. package) return false @@ -166,7 +166,7 @@ local function installPackage(package, overwriteFlag) if agcfg[package].dependencies then for _, dependency in ipairs(agcfg[package].dependencies) do if not agReg[dependency] and not agcfg[dependency] then - local response = terminal.read(nil, "\27[91mPackage " .. package .. " requires dependency " .. dependency .. " that does not exist.\n[A - Abort/s - Skip]") + local response = terminal.read({prefix = "\27[91mPackage " .. package .. " requires dependency " .. dependency .. " that does not exist.\n[A - Abort/s - Skip]"}) if response:lower() ~= "s" then fs.remove("/argentum/store/" .. package) return false @@ -199,7 +199,7 @@ local function installPackage(package, overwriteFlag) local data, errorMessage = getFile(source .. agcfg[package].maindir .. file) if not data then clearProgress() - local response = terminal.read(nil, "\27[91mCould not fetch " .. file .. ": " .. errorMessage .. "\n\27[0m[a - Abort/R - Retry/s - Skip]") + local response = terminal.read({prefix = "\27[91mCould not fetch " .. file .. ": " .. errorMessage .. "\n\27[0m[a - Abort/R - Retry/s - Skip]"}) if response:lower() == "a" then fs.remove("/argentum/store/" .. package) return false @@ -258,7 +258,7 @@ local function removePackage(package) local result, errorMessage = fs.remove(line:sub(2)) if not result then clearProgress() - local response = terminal.read(nil, "\27[91mFailed to remove " .. line:sub(2) .. ": " .. errorMessage .. "\n\27[0m[a - Abort/r - Retry/S - Skip]") + local response = terminal.read({prefix = "\27[91mFailed to remove " .. line:sub(2) .. ": " .. errorMessage .. "\n\27[0m[a - Abort/r - Retry/S - Skip]"}) if response:lower() == "a" then return false elseif response:lower() == "r" then @@ -274,7 +274,7 @@ local function removePackage(package) local handle, data, tmpdata = fs.open("/argentum/store/" .. package .. "/files/" .. line:sub(2), "r"), "", nil if not handle then clearProgress() - local response = terminal.read(nil, "\27[91mFailed to revert " .. line:sub(2) .. ": " .. data .. "\n\27[0m[a - Abort/R - Retry/s - Skip]") -- this is pretty stupid but i think the error message would get pushed to data + local response = terminal.read({prefix = "\27[91mFailed to revert " .. line:sub(2) .. ": " .. data .. "\n\27[0m[a - Abort/R - Retry/s - Skip]"}) -- this is pretty stupid but i think the error message would get pushed to data if response:lower() == "a" then return false elseif response:lower() == "s" then @@ -360,7 +360,7 @@ if command == "install" then local answer if #fails == 0 then print("Packages that will be installed: " .. table.concat(packageList, ", ")) - if terminal.read(nil, "Would you like to proceed? [Y/n] "):lower() == "n" then + if terminal.read({prefix = "Would you like to proceed? [Y/n] "}):lower() == "n" then return end elseif #packageList == 0 then @@ -370,7 +370,7 @@ if command == "install" then print("Some packages cannot be installed.") print("Packages that will be installed: " .. table.concat(packageList, ", ")) print("Packages that cannot be installed: " .. table.concat(fails, ", ")) - if terminal.read(nil, "Would you like to proceed? [y/N] "):lower() ~= "y" then + if terminal.read({prefix = "Would you like to proceed? [y/N] "}):lower() ~= "y" then return end end @@ -452,7 +452,7 @@ elseif command == "remove" then local answer if #fails == 0 then print("Packages that will be removed: " .. table.concat(packageList, ", ")) - if terminal.read(nil, "Would you like to proceed? [Y/n] "):lower() == "n" then + if terminal.read({prefix = "Would you like to proceed? [Y/n] "}):lower() == "n" then return end elseif #packageList == 0 then @@ -462,7 +462,7 @@ elseif command == "remove" then print("Some packages cannot be removed.") print("Packages that will be removed: " .. table.concat(packageList, ", ")) print("Packages that cannot be removed: " .. table.concat(fails, ", ")) - if terminal.read(nil, "Would you like to proceed? [y/N] "):lower() ~= "y" then + if terminal.read({prefix = "Would you like to proceed? [y/N] "}):lower() ~= "y" then return end end @@ -560,14 +560,14 @@ elseif command == "update" then end elseif #fails == 0 then print("Packages that will be updated: " .. table.concat(packageList, ", ")) - if terminal.read(nil, "Would you like to proceed? [Y/n] "):lower() == "n" then + if terminal.read({prefix = "Would you like to proceed? [Y/n] "}):lower() == "n" then return end else print("Some packages cannot be updated.") print("Packages that will be updated: " .. table.concat(packageList, ", ")) print("Packages that cannot be updated: " .. table.concat(fails, ", ")) - if terminal.read(nil, "Would you like to proceed? [y/N] "):lower() ~= "y" then + if terminal.read({prefix = "Would you like to proceed? [y/N] "}):lower() ~= "y" then return end end diff --git a/halyde/apps/download.lua b/halyde/apps/download.lua index 6098730..7a53a39 100644 --- a/halyde/apps/download.lua +++ b/halyde/apps/download.lua @@ -43,7 +43,7 @@ repeat if fs.isDirectory(saveLocation) then print("\27[91mThe specified location is a directory.") elseif fs.exists(saveLocation) then - local answer = read(nil, "\27[91mThere is already a file at the specified directory. Overwrite it? [Y/n]") + local answer = terminal.read({prefix = "\27[91mThere is already a file at the specified directory. Overwrite it? [Y/n]"}) if answer:lower() ~= "n" then saveLocationOK = true end diff --git a/halyde/apps/edit.lua b/halyde/apps/edit.lua index 0cbb9be..a8917f7 100644 --- a/halyde/apps/edit.lua +++ b/halyde/apps/edit.lua @@ -262,12 +262,12 @@ local function save() gpu.setForeground(0) gpu.set(1, height - 1, string.rep(" ", width)) terminal.setCursorPos(1, height - 1) - local savepath = terminal.read(nil, "\27[107m\27[30mSave location: ", filepath) + local savepath = terminal.read({prefix = "\27[107m\27[30mSave location: ", defaultText = filepath}) gpu.setBackground(0xFFFFFF) gpu.setForeground(0) if fs.exists(savepath) then gpu.set(1, height - 1, string.rep(" ", width)) - local answer = terminal.read(nil, "\27[107m\27[30mFile already exists. Overwrite it? [Y/n] ") + local answer = terminal.read({prefix = "\27[107m\27[30mFile already exists. Overwrite it? [Y/n] "}) if answer:lower() == "n" then gpu.setBackground(0xFFFFFF) gpu.setForeground(0) @@ -301,7 +301,7 @@ while true do if specialKey == "x" then if changesMade then terminal.setCursorPos(1, height - 1) - local response = terminal.read(nil, "\27[107m\27[30mWould you like to save changes? [Y/n] ") + local response = terminal.read({prefix = "\27[107m\27[30mWould you like to save changes? [Y/n] "}) if response:lower() ~= "n" then save() end diff --git a/halyde/apps/lua.lua b/halyde/apps/lua.lua index ccf2a03..783b0cc 100644 --- a/halyde/apps/lua.lua +++ b/halyde/apps/lua.lua @@ -46,7 +46,7 @@ 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 ") + local command = terminal.read({readHistoryType = "lua", prefix = "\27[44mlua>\27[0m "}) if command == "exit" then coroutine.yield() return diff --git a/halyde/kernel/modules/terminal.lua b/halyde/kernel/modules/terminal.lua index ffd254f..8c36d1f 100644 --- a/halyde/kernel/modules/terminal.lua +++ b/halyde/kernel/modules/terminal.lua @@ -254,36 +254,43 @@ function module.init() cursorPosX, cursorPosY = 1, 1 end - function _G._PUBLIC.terminal.read(readHistoryType, prefix, defaultText, maxChars) - checkArg(1, readHistoryType, "string", "nil") - checkArg(2, prefix, "string", "nil") - checkArg(3, defaultText, "string", "nil") - checkArg(4, maxChars, "number", "nil") - maxChars = maxChars or math.huge + function _G._PUBLIC.terminal.read(options) + checkArg(1, options, "table", "nil") + local function checkOption(name, value, neededType) + assert(type(value) == "string" or not value, ("%s option must be %s, %s provided"):format(name, neededType, type(value))) + end + if options then + checkOption("readHistoryType", options.readHistoryType, "string") + checkOption("prefix", options.prefix, "string") + checkOption("maxChars", options.maxChars, "number") + checkOption("defaultText", options.defaultText, "string") + end - local text = defaultText or "" + options.maxChars = options.maxChars or math.huge + + local text = options.defaultText or "" local historyIdx - if readHistoryType then - if not readHistory[readHistoryType] then - readHistory[readHistoryType] = {text} - elseif readHistory[readHistoryType][#readHistory[readHistoryType] ] ~= text then - table.insert(readHistory[readHistoryType], text) + if options.readHistoryType then + if not readHistory[options.readHistoryType] then + readHistory[options.readHistoryType] = {text} + elseif readHistory[options.readHistoryType][#readHistory[options.readHistoryType] ] ~= text then + table.insert(readHistory[options.readHistoryType], text) end - historyIdx = #readHistory[readHistoryType] + historyIdx = #readHistory[options.readHistoryType] end local function updateHistory() - if not readHistoryType then return end - readHistory[readHistoryType][historyIdx]=text + if not options.readHistoryType then return end + readHistory[options.readHistoryType][historyIdx]=text end local cur = unicode.len(text)+1 - if prefix then _PUBLIC.terminal.write(prefix) end + if options.prefix then _PUBLIC.terminal.write(options.prefix) end local startX, startY = cursorPosX, cursorPosY local fg, bg = gpu.getForeground(), gpu.getBackground() local cursorBlink = true - local function get(idx) + local function get(idx) -- FIXME: Why is this here if it's unused? idx=startX+idx-1 return gpu.get(idx%width,startY+(idx//width)) end @@ -294,7 +301,7 @@ function module.init() end return math.min(y,height) end - local function set(idx,chr,rev) + local function set(idx,chr,rev) -- FIXME: Very clear variable naming... I would fix it but I don't even know what they mean. if chr==nil or chr=="" then return end if rev then gpu.setForeground(bg) @@ -321,13 +328,13 @@ function module.init() end local function add(chr) if type(chr)~="string" or #chr==0 then return end - if unicode.len(text)>=maxChars then return end - if maxChars=options.maxChars then return end + if options.maxChars 50 do - table.remove(readHistory[readHistoryType], 1) + while #readHistory[options.readHistoryType] > 50 do + table.remove(readHistory[options.readHistoryType], 1) end end