Skip to content

Commit cfb8080

Browse files
committed
refactored constructors
1 parent 3817bf2 commit cfb8080

3 files changed

Lines changed: 110 additions & 47 deletions

File tree

decoder.go

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,81 @@ package linebuf
33
import (
44
"bufio"
55
"io"
6+
"math"
67
"reflect"
78

89
"code.cloudfoundry.org/bytefmt"
910
"github.com/segmentio/encoding/json"
1011
)
1112

13+
type DecoderOption (func(*Decoder) error)
14+
1215
/*
13-
NewDecoder returns a linebuf decoder from an io.Reader. The buffersize will be 4kB
16+
WithDecoderUnbuffered can be provided as option to NewDecoder, thus turning off buffer mode
1417
*/
15-
func NewDecoder(r io.Reader) *Decoder {
16-
d, _ := NewDecoderWithBuffersize(r, "4k")
17-
return d
18+
func WithDecoderUnbuffered() DecoderOption {
19+
return func(dec *Decoder) error {
20+
dec.unbuffered = true
21+
return nil
22+
}
1823
}
1924

2025
/*
21-
NewDecoderWithBuffersize returns a linebuf decoder from an io.Reader while allowing to specify a custom buffersize.
26+
WithDecoderBuffersize can be used as option to NewDecoder, thus providing another buffersize than the default 4k
27+
*/
28+
func WithDecoderBuffersize(bufSize string) DecoderOption {
29+
return func(dec *Decoder) error {
30+
var (
31+
bufBytes uint64
32+
err error
33+
)
34+
if bufBytes, err = bytefmt.ToBytes(bufSize); err != nil {
35+
return err
36+
}
37+
dec.bufBytes = bufBytes
38+
return nil
39+
}
40+
}
2241

23-
An error will be returned if parsing of the bufsize fails
42+
/*
43+
NewDecoder returns a linebuf decoder from an io.Reader while allowing to specify custom options like unbuffered mode and/or setting the buffer size.
44+
45+
The default buffer size is 4k
46+
47+
An error will be returned e.g. if parsing of the bufsize fails
2448
*/
25-
func NewDecoderWithBuffersize(r io.Reader, bufSize string) (*Decoder, error) {
49+
func NewDecoder(r io.Reader, options ...DecoderOption) (*Decoder, error) {
2650
var (
27-
err error
28-
bufBytes uint64
29-
jsonDec *json.Decoder
30-
buf *bufio.Reader
51+
err error
52+
jsonDec *json.Decoder
53+
option DecoderOption
54+
dec = &Decoder{
55+
err: nil,
56+
r: r,
57+
s: make(chan interface{}),
58+
}
59+
buf *bufio.Reader
3160
)
3261

33-
if bufBytes, err = bytefmt.ToBytes(bufSize); err != nil {
34-
return nil, err
62+
for _, option = range options {
63+
if err = option(dec); err != nil {
64+
return nil, err
65+
}
3566
}
3667

37-
buf = bufio.NewReaderSize(r, int(bufBytes))
68+
buf = bufio.NewReaderSize(r, int(math.Max(float64(dec.bufBytes), 4<<10)))
3869
jsonDec = json.NewDecoder(buf)
3970
jsonDec.ZeroCopy()
4071
jsonDec.UseNumber()
4172
jsonDec.DontMatchCaseInsensitiveStructFields()
42-
return &Decoder{
43-
buf: buf,
44-
err: nil,
45-
r: r,
46-
s: make(chan interface{}, 10),
47-
jsonDec: jsonDec,
48-
}, nil
73+
74+
dec.buf = buf
75+
dec.jsonDec = jsonDec
76+
if !dec.unbuffered {
77+
dec.s = make(chan interface{}, 10)
78+
}
79+
80+
return dec, nil
4981
}
5082

5183
/*

encoder.go

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,71 @@ package linebuf
33
import (
44
"bufio"
55
"io"
6+
"math"
67
"time"
78

89
"code.cloudfoundry.org/bytefmt"
910
"github.com/segmentio/encoding/json"
1011
)
1112

13+
type EncoderOption (func(*Encoder) error)
14+
1215
/*
13-
NewEncoder returns a linebuf encoder from an io.Writer. The buffersize will be 4kB
16+
WithUnbuffered can be provided as option to NewEncoder, thus turning off buffer mode
1417
*/
15-
func NewEncoder(w io.Writer) *Encoder {
16-
e, _ := NewEncoderWithBuffersize(w, "4k")
17-
return e
18+
func WithEncoderUnbuffered() EncoderOption {
19+
return func(enc *Encoder) error {
20+
enc.unbuffered = true
21+
return nil
22+
}
1823
}
1924

2025
/*
21-
NewEncoderWithBuffersize returns a linebuf encoder from an io.Writer while allowing to specify a custom buffersize.
26+
WithBuffersize can be used as option to NewEncoder, thus providing another buffersize than the default 4k
27+
*/
28+
func WithEncoderBuffersize(bufSize string) EncoderOption {
29+
return func(enc *Encoder) error {
30+
var (
31+
bufBytes uint64
32+
err error
33+
)
34+
if bufBytes, err = bytefmt.ToBytes(bufSize); err != nil {
35+
return err
36+
}
37+
enc.bufBytes = bufBytes
38+
return nil
39+
}
40+
}
41+
42+
/*
43+
NewEncoder returns a linebuf encoder from an io.Writer while allowing to sspecify custom options like unbuffered mode and/or setting the buffer size.
2244
23-
An error will be returned if parsing of the bufsize fails
45+
The default buffer size is 4k
46+
47+
An error will be returned e.g. if parsing of the bufsize fails
2448
*/
25-
func NewEncoderWithBuffersize(w io.Writer, bufSize string) (*Encoder, error) {
49+
func NewEncoder(w io.Writer, options ...EncoderOption) (*Encoder, error) {
2650
var (
27-
err error
28-
bufBytes uint64
29-
buf *bufio.Writer
51+
err error
52+
option EncoderOption
53+
buf *bufio.Writer
54+
enc = &Encoder{
55+
w: w,
56+
s: make(chan interface{}),
57+
err: nil,
58+
}
3059
)
3160

32-
if bufBytes, err = bytefmt.ToBytes(bufSize); err != nil {
33-
return nil, err
61+
for _, option = range options {
62+
if err = option(enc); err != nil {
63+
return nil, err
64+
}
3465
}
3566

36-
buf = bufio.NewWriterSize(w, int(bufBytes))
37-
return &Encoder{
38-
buf: buf,
39-
w: w,
40-
s: make(chan interface{}, 10),
41-
err: nil,
42-
jsonEncoder: json.NewEncoder(buf),
43-
}, nil
67+
buf = bufio.NewWriterSize(w, int(math.Max(float64(enc.bufBytes), 4<<10)))
68+
enc.buf = buf
69+
enc.jsonEncoder = json.NewEncoder(enc.buf)
70+
return enc, nil
4471
}
4572

4673
/*

linebuf.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,21 @@ type Encoder struct {
4141
once sync.Once
4242
jsonEncoder *json.Encoder
4343
closeOnce sync.Once
44+
unbuffered bool
45+
bufBytes uint64
4446
}
4547

4648
/*
4749
Decoder reads line-buffered JSON from the underlaying io.Reader and decodes them in single-entry modde or stream mode
4850
*/
4951
type Decoder struct {
5052
context.Context
51-
buf *bufio.Reader
52-
r io.Reader
53-
s chan interface{}
54-
once sync.Once
55-
err error
56-
jsonDec *json.Decoder
53+
buf *bufio.Reader
54+
r io.Reader
55+
s chan interface{}
56+
once sync.Once
57+
err error
58+
jsonDec *json.Decoder
59+
unbuffered bool
60+
bufBytes uint64
5761
}

0 commit comments

Comments
 (0)