-
Notifications
You must be signed in to change notification settings - Fork 34
/
util_io.go
107 lines (86 loc) · 2.01 KB
/
util_io.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package transformer
import (
"io"
"strings"
"github.com/pkg/errors"
)
type CanInterface interface {
Interface() interface{}
}
type CanString interface {
String() string
}
func NewStringReaders(values []string) *StringReaders {
bs := make([]io.Reader, len(values))
for i := range values {
bs[i] = &StringReader{v: values[i]}
}
return &StringReaders{
readers: bs,
values: values,
}
}
type StringReaders struct {
idx int
readers []io.Reader
values []string
}
func (v *StringReaders) Interface() interface{} { return v.values }
func (v *StringReaders) Len() int { return len(v.readers) }
func (v *StringReaders) Read(p []byte) (n int, err error) {
if v.idx < len(v.readers) {
return v.readers[v.idx].Read(p)
}
return -1, errors.Errorf("bounds out of range, %d", v.idx)
}
func (v *StringReaders) NextReader() io.Reader {
r := v.readers[v.idx]
v.idx++
return r
}
func NewStringReader(v string) *StringReader { return &StringReader{v: v} }
type StringReader struct {
v string
r io.Reader
}
func (r *StringReader) Read(p []byte) (n int, err error) {
if r.r == nil {
r.r = strings.NewReader(r.v)
}
return r.r.Read(p)
}
func (r *StringReader) Interface() interface{} { return r.v }
func (r *StringReader) String() string { return r.v }
func NewStringBuilders() *StringBuilders { return &StringBuilders{} }
type StringBuilders struct {
idx int
buffers []*strings.Builder
}
func (v *StringBuilders) SetN(n int) {
v.buffers = make([]*strings.Builder, n)
v.idx = 0
for i := range v.buffers {
v.buffers[i] = &strings.Builder{}
}
}
func (v *StringBuilders) NextWriter() io.Writer {
if v.idx == 0 && len(v.buffers) == 0 {
v.SetN(1)
}
r := v.buffers[v.idx]
v.idx++
return r
}
func (v *StringBuilders) Write(p []byte) (n int, err error) {
if v.idx == 0 && len(v.buffers) == 0 {
v.SetN(1)
}
return v.buffers[v.idx].Write(p)
}
func (v *StringBuilders) StringSlice() []string {
values := make([]string, len(v.buffers))
for i, b := range v.buffers {
values[i] = b.String()
}
return values
}