Skip to content

Commit

Permalink
feat: add hilbish.sink interface to create sinks
Browse files Browse the repository at this point in the history
  • Loading branch information
TorchedSammy committed Dec 29, 2024
1 parent 56ba00e commit 679c7b2
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 14 deletions.
4 changes: 4 additions & 0 deletions api.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"syscall"
"time"

"hilbish/sink"
"hilbish/util"

rt "github.com/arnodel/golua/runtime"
Expand Down Expand Up @@ -133,6 +134,9 @@ func hilbishLoad(rtm *rt.Runtime) (rt.Value, func()) {
pluginModule := moduleLoader(rtm)
mod.Set(rt.StringValue("module"), rt.TableValue(pluginModule))

sinkModule := sink.Loader(l)
mod.Set(rt.StringValue("sink"), rt.TableValue(sinkModule))

return rt.TableValue(mod), nil
}

Expand Down
2 changes: 0 additions & 2 deletions lua.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"fmt"
"os"

"hilbish/sink"
"hilbish/util"
"hilbish/golibs/bait"
"hilbish/golibs/commander"
Expand All @@ -25,7 +24,6 @@ func luaInit() {
MessageHandler: debuglib.Traceback,
})
lib.LoadAll(l)
sink.SetupSinkType(l)

lib.LoadLibs(l, hilbishLoader)
// yes this is stupid, i know
Expand Down
52 changes: 40 additions & 12 deletions sink/sink.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package sink

import (
"bufio"
"bytes"
"fmt"
"io"
"os"
Expand All @@ -18,14 +19,13 @@ var sinkMetaKey = rt.StringValue("hshsink")
// A sink is a structure that has input and/or output to/from
// a desination.
type Sink struct{
writer *bufio.Writer
reader *bufio.Reader
rw *bufio.ReadWriter
file *os.File
UserData *rt.UserData
autoFlush bool
}

func SetupSinkType(rtm *rt.Runtime) {
func Loader(rtm *rt.Runtime) *rt.Table {
sinkMeta := rt.NewTable()

sinkMethods := rt.NewTable()
Expand Down Expand Up @@ -65,9 +65,24 @@ func SetupSinkType(rtm *rt.Runtime) {

sinkMeta.Set(rt.StringValue("__index"), rt.FunctionValue(rt.NewGoFunction(sinkIndex, "__index", 2, false)))
rtm.SetRegistry(sinkMetaKey, rt.TableValue(sinkMeta))

exports := map[string]util.LuaExport{
"new": {luaSinkNew, 0, false},
}

mod := rt.NewTable()
util.SetExports(rtm, mod, exports)

return mod
}


func luaSinkNew(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
snk := NewSink(t.Runtime, new(bytes.Buffer))

return c.PushingNext1(t.Runtime, rt.UserDataValue(snk.UserData)), nil
}

// #member
// readAll() -> string
// --- @returns string
Expand All @@ -84,7 +99,7 @@ func luaSinkReadAll(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {

lines := []string{}
for {
line, err := s.reader.ReadString('\n')
line, err := s.rw.ReadString('\n')
if err != nil {
if err == io.EOF {
break
Expand Down Expand Up @@ -113,7 +128,7 @@ func luaSinkRead(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
return nil, err
}

str, _ := s.reader.ReadString('\n')
str, _ := s.rw.ReadString('\n')

return c.PushingNext1(t.Runtime, rt.StringValue(str)), nil
}
Expand All @@ -135,9 +150,9 @@ func luaSinkWrite(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
return nil, err
}

s.writer.Write([]byte(data))
s.rw.Write([]byte(data))
if s.autoFlush {
s.writer.Flush()
s.rw.Flush()
}

return c.Next(), nil
Expand All @@ -160,9 +175,9 @@ func luaSinkWriteln(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
return nil, err
}

s.writer.Write([]byte(data + "\n"))
s.rw.Write([]byte(data + "\n"))
if s.autoFlush {
s.writer.Flush()
s.rw.Flush()
}

return c.Next(), nil
Expand All @@ -181,7 +196,7 @@ func luaSinkFlush(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
return nil, err
}

s.writer.Flush()
s.rw.Flush()

return c.Next(), nil
}
Expand Down Expand Up @@ -212,9 +227,22 @@ func luaSinkAutoFlush(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
return c.Next(), nil
}

func NewSink(rtm *rt.Runtime, rw io.ReadWriter) *Sink {
s := &Sink{
rw: bufio.NewReadWriter(bufio.NewReader(rw), bufio.NewWriter(rw)),
}
s.UserData = sinkUserData(rtm, s)

if f, ok := rw.(*os.File); ok {
s.file = f
}

return s
}

func NewSinkInput(rtm *rt.Runtime, r io.Reader) *Sink {
s := &Sink{
reader: bufio.NewReader(r),
rw: bufio.NewReadWriter(bufio.NewReader(r), nil),
}
s.UserData = sinkUserData(rtm, s)

Expand All @@ -227,7 +255,7 @@ func NewSinkInput(rtm *rt.Runtime, r io.Reader) *Sink {

func NewSinkOutput(rtm *rt.Runtime, w io.Writer) *Sink {
s := &Sink{
writer: bufio.NewWriter(w),
rw: bufio.NewReadWriter(nil, bufio.NewWriter(w)),
autoFlush: true,
}
s.UserData = sinkUserData(rtm, s)
Expand Down

0 comments on commit 679c7b2

Please sign in to comment.