From e510b1103ff4f77353aa5f71ae0aff3ff9a2440f Mon Sep 17 00:00:00 2001 From: sammyette Date: Fri, 20 Jan 2023 18:35:10 -0400 Subject: [PATCH] feat: use sinks for all nature commands, add writeln function --- nature/commands/bg.lua | 6 +++--- nature/commands/cat.lua | 6 +++--- nature/commands/cd.lua | 8 ++++---- nature/commands/cdr.lua | 12 ++++++------ nature/commands/disown.lua | 8 ++++---- nature/commands/doc.lua | 8 ++++---- nature/commands/fg.lua | 6 +++--- sink.go | 20 ++++++++++++++++++++ 8 files changed, 47 insertions(+), 27 deletions(-) diff --git a/nature/commands/bg.lua b/nature/commands/bg.lua index f0aa462..a7f486a 100644 --- a/nature/commands/bg.lua +++ b/nature/commands/bg.lua @@ -1,15 +1,15 @@ local commander = require 'commander' -commander.register('bg', function() +commander.register('bg', function(_, sinks) local job = hilbish.jobs.last() if not job then - print 'bg: no last job' + sinks.out:writeln 'bg: no last job' return 1 end local err = job.background() if err then - print('bg: ' .. err) + sinks.out:writeln('bg: ' .. err) return 2 end end) diff --git a/nature/commands/cat.lua b/nature/commands/cat.lua index 52e5cda..06df507 100644 --- a/nature/commands/cat.lua +++ b/nature/commands/cat.lua @@ -5,7 +5,7 @@ commander.register('cat', function(args, sinks) local exit = 0 if #args == 0 then - print [[ + sinks.out:writeln [[ usage: cat [file]...]] end @@ -13,11 +13,11 @@ usage: cat [file]...]] local f = io.open(fName) if f == nil then exit = 1 - print(string.format('cat: %s: no such file or directory', fName)) + sinks.out:writeln(string.format('cat: %s: no such file or directory', fName)) goto continue end - sinks.out:write(f:read '*a') + sinks.out:writeln(f:read '*a') ::continue:: end io.flush() diff --git a/nature/commands/cd.lua b/nature/commands/cd.lua index b4d1041..8f68271 100644 --- a/nature/commands/cd.lua +++ b/nature/commands/cd.lua @@ -4,9 +4,9 @@ local fs = require 'fs' local dirs = require 'nature.dirs' dirs.old = hilbish.cwd() -commander.register('cd', function (args) +commander.register('cd', function (args, sinks) if #args > 1 then - print("cd: too many arguments") + sinks.out:writeln("cd: too many arguments") return 1 elseif #args > 0 then local path = args[1]:gsub('$%$','\0'):gsub('${([%w_]+)}', os.getenv) @@ -14,14 +14,14 @@ commander.register('cd', function (args) if path == '-' then path = dirs.old - print(path) + sinks.out:writeln(path) end dirs.setOld(hilbish.cwd()) dirs.push(path) local ok, err = pcall(function() fs.cd(path) end) if not ok then - print(err) + sinks.out:writeln(err) return 1 end bait.throw('cd', path) diff --git a/nature/commands/cdr.lua b/nature/commands/cdr.lua index 0438e6f..288ae22 100644 --- a/nature/commands/cdr.lua +++ b/nature/commands/cdr.lua @@ -3,9 +3,9 @@ local fs = require 'fs' local lunacolors = require 'lunacolors' local dirs = require 'nature.dirs' -commander.register('cdr', function(args) +commander.register('cdr', function(args, sinks) if not args[1] then - print(lunacolors.format [[ + sinks.out:writeln(lunacolors.format [[ cdr: change directory to one which has been recently visied usage: cdr @@ -17,21 +17,21 @@ to get a list of recent directories, use {green}{underline}cdr list{reset}]]) if args[1] == 'list' then local recentDirs = dirs.recentDirs if #recentDirs == 0 then - print 'No directories have been visited.' + sinks.out:writeln 'No directories have been visited.' return 1 end - print(table.concat(recentDirs, '\n')) + sinks.out:writeln(table.concat(recentDirs, '\n')) return end local index = tonumber(args[1]) if not index then - print(string.format('Received %s as index, which isn\'t a number.', index)) + sinks.out:writeln(string.format('Received %s as index, which isn\'t a number.', index)) return 1 end if not dirs.recent(index) then - print(string.format('No recent directory found at index %s.', index)) + sinks.out:writeln(string.format('No recent directory found at index %s.', index)) return 1 end diff --git a/nature/commands/disown.lua b/nature/commands/disown.lua index f8f144f..6645a0f 100644 --- a/nature/commands/disown.lua +++ b/nature/commands/disown.lua @@ -1,8 +1,8 @@ local commander = require 'commander' -commander.register('disown', function(args) +commander.register('disown', function(args, sinks) if #hilbish.jobs.all() == 0 then - print 'disown: no current job' + sinks.out:writeln 'disown: no current job' return 1 end @@ -10,7 +10,7 @@ commander.register('disown', function(args) if #args < 0 then id = tonumber(args[1]) if not id then - print 'disown: invalid id for job' + sinks.out:writeln 'disown: invalid id for job' return 1 end else @@ -19,7 +19,7 @@ commander.register('disown', function(args) local ok = pcall(hilbish.jobs.disown, id) if not ok then - print 'disown: job does not exist' + sinks.out:writeln 'disown: job does not exist' return 2 end end) diff --git a/nature/commands/doc.lua b/nature/commands/doc.lua index df9d4c0..621791d 100644 --- a/nature/commands/doc.lua +++ b/nature/commands/doc.lua @@ -30,7 +30,7 @@ commander.register('doc', function(args, sinks) f = io.open(moddocPath .. subdocName .. '.md', 'rb') end if not f then - sinks.out:write('No documentation found for ' .. mod .. '.') + sinks.out:writeln('No documentation found for ' .. mod .. '.') return end end @@ -74,7 +74,7 @@ commander.register('doc', function(args, sinks) end):gsub('#+.-\n', function(t) return '{bold}{magenta}' .. t .. '{reset}' end)) - sinks.out:write(formattedFuncs) + sinks.out:writeln(formattedFuncs) f:close() return @@ -83,7 +83,7 @@ commander.register('doc', function(args, sinks) return lunacolors.underline(lunacolors.blue(string.gsub(f, '.md', ''))) end) - sinks.out:write [[ + sinks.out:writeln [[ Welcome to Hilbish's doc tool! Here you can find documentation for builtin functions and other things. @@ -92,5 +92,5 @@ A section is a module or a literal section and a subdoc is a subsection for it. Available sections: ]] - sinks.out:write(table.concat(modules, ', ') .. '\n') + sinks.out:writeln(table.concat(modules, ', ')) end) diff --git a/nature/commands/fg.lua b/nature/commands/fg.lua index a3f1451..64b145f 100644 --- a/nature/commands/fg.lua +++ b/nature/commands/fg.lua @@ -1,15 +1,15 @@ local commander = require 'commander' -commander.register('fg', function() +commander.register('fg', function(_, sinks) local job = hilbish.jobs.last() if not job then - print 'fg: no last job' + sinks.out:writeln 'fg: no last job' return 1 end local err = job.foreground() -- waits for job; blocks if err then - print('fg: ' .. err) + sinks.out:writeln('fg: ' .. err) return 2 end end) diff --git a/sink.go b/sink.go index 619c3f8..54f5014 100644 --- a/sink.go +++ b/sink.go @@ -25,6 +25,7 @@ func setupSinkType(rtm *rt.Runtime) { sinkMethods := rt.NewTable() sinkFuncs := map[string]util.LuaExport{ "write": {luaSinkWrite, 2, false}, + "writeln": {luaSinkWriteln, 2, false}, } util.SetExports(l, sinkMethods, sinkFuncs) @@ -58,6 +59,25 @@ func luaSinkWrite(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } +func luaSinkWriteln(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { + if err := c.CheckNArgs(2); err != nil { + return nil, err + } + + s, err := sinkArg(c, 0) + if err != nil { + return nil, err + } + data, err := c.StringArg(1) + if err != nil { + return nil, err + } + + s.writer.Write([]byte(data + "\n")) + + return c.Next(), nil +} + func newSinkInput(r io.Reader) *sink { s := &sink{ reader: r,