Skip to content

Commit 679c7b2

Browse files
committed
feat: add hilbish.sink interface to create sinks
1 parent 56ba00e commit 679c7b2

File tree

3 files changed

+44
-14
lines changed

3 files changed

+44
-14
lines changed

api.go

+4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"syscall"
2424
"time"
2525

26+
"hilbish/sink"
2627
"hilbish/util"
2728

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

137+
sinkModule := sink.Loader(l)
138+
mod.Set(rt.StringValue("sink"), rt.TableValue(sinkModule))
139+
136140
return rt.TableValue(mod), nil
137141
}
138142

lua.go

-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"os"
66

7-
"hilbish/sink"
87
"hilbish/util"
98
"hilbish/golibs/bait"
109
"hilbish/golibs/commander"
@@ -25,7 +24,6 @@ func luaInit() {
2524
MessageHandler: debuglib.Traceback,
2625
})
2726
lib.LoadAll(l)
28-
sink.SetupSinkType(l)
2927

3028
lib.LoadLibs(l, hilbishLoader)
3129
// yes this is stupid, i know

sink/sink.go

+40-12
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package sink
22

33
import (
44
"bufio"
5+
"bytes"
56
"fmt"
67
"io"
78
"os"
@@ -18,14 +19,13 @@ var sinkMetaKey = rt.StringValue("hshsink")
1819
// A sink is a structure that has input and/or output to/from
1920
// a desination.
2021
type Sink struct{
21-
writer *bufio.Writer
22-
reader *bufio.Reader
22+
rw *bufio.ReadWriter
2323
file *os.File
2424
UserData *rt.UserData
2525
autoFlush bool
2626
}
2727

28-
func SetupSinkType(rtm *rt.Runtime) {
28+
func Loader(rtm *rt.Runtime) *rt.Table {
2929
sinkMeta := rt.NewTable()
3030

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

6666
sinkMeta.Set(rt.StringValue("__index"), rt.FunctionValue(rt.NewGoFunction(sinkIndex, "__index", 2, false)))
6767
rtm.SetRegistry(sinkMetaKey, rt.TableValue(sinkMeta))
68+
69+
exports := map[string]util.LuaExport{
70+
"new": {luaSinkNew, 0, false},
71+
}
72+
73+
mod := rt.NewTable()
74+
util.SetExports(rtm, mod, exports)
75+
76+
return mod
6877
}
6978

7079

80+
func luaSinkNew(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
81+
snk := NewSink(t.Runtime, new(bytes.Buffer))
82+
83+
return c.PushingNext1(t.Runtime, rt.UserDataValue(snk.UserData)), nil
84+
}
85+
7186
// #member
7287
// readAll() -> string
7388
// --- @returns string
@@ -84,7 +99,7 @@ func luaSinkReadAll(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
8499

85100
lines := []string{}
86101
for {
87-
line, err := s.reader.ReadString('\n')
102+
line, err := s.rw.ReadString('\n')
88103
if err != nil {
89104
if err == io.EOF {
90105
break
@@ -113,7 +128,7 @@ func luaSinkRead(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
113128
return nil, err
114129
}
115130

116-
str, _ := s.reader.ReadString('\n')
131+
str, _ := s.rw.ReadString('\n')
117132

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

138-
s.writer.Write([]byte(data))
153+
s.rw.Write([]byte(data))
139154
if s.autoFlush {
140-
s.writer.Flush()
155+
s.rw.Flush()
141156
}
142157

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

163-
s.writer.Write([]byte(data + "\n"))
178+
s.rw.Write([]byte(data + "\n"))
164179
if s.autoFlush {
165-
s.writer.Flush()
180+
s.rw.Flush()
166181
}
167182

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

184-
s.writer.Flush()
199+
s.rw.Flush()
185200

186201
return c.Next(), nil
187202
}
@@ -212,9 +227,22 @@ func luaSinkAutoFlush(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
212227
return c.Next(), nil
213228
}
214229

230+
func NewSink(rtm *rt.Runtime, rw io.ReadWriter) *Sink {
231+
s := &Sink{
232+
rw: bufio.NewReadWriter(bufio.NewReader(rw), bufio.NewWriter(rw)),
233+
}
234+
s.UserData = sinkUserData(rtm, s)
235+
236+
if f, ok := rw.(*os.File); ok {
237+
s.file = f
238+
}
239+
240+
return s
241+
}
242+
215243
func NewSinkInput(rtm *rt.Runtime, r io.Reader) *Sink {
216244
s := &Sink{
217-
reader: bufio.NewReader(r),
245+
rw: bufio.NewReadWriter(bufio.NewReader(r), nil),
218246
}
219247
s.UserData = sinkUserData(rtm, s)
220248

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

228256
func NewSinkOutput(rtm *rt.Runtime, w io.Writer) *Sink {
229257
s := &Sink{
230-
writer: bufio.NewWriter(w),
258+
rw: bufio.NewReadWriter(nil, bufio.NewWriter(w)),
231259
autoFlush: true,
232260
}
233261
s.UserData = sinkUserData(rtm, s)

0 commit comments

Comments
 (0)