lotus/postfix-config/comma-list-scanner/comma-list-scanner.go

58 lines
1.1 KiB
Go

package comma_list_scanner
import (
"bufio"
"bytes"
"fmt"
"io"
)
type CommaListScanner struct {
r *bufio.Scanner
text string
err error
}
func NewCommaListScanner(r io.Reader) *CommaListScanner {
s := bufio.NewScanner(r)
s.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
if atEOF && len(data) == 0 {
return 0, nil, nil
}
println("data", fmt.Sprintf("%s", data))
println("index", bytes.IndexAny(data, " ,"))
if i := bytes.IndexAny(data, " ,"); i >= 0 {
// consume all spaces after the comma
j := i + 1
for j < len(data) && data[j] == ' ' {
j++
}
return j, bytes.TrimSpace(data[0:i]), nil
}
// If we're at EOF, we have a final non-terminated line. Return it.
if atEOF {
return len(data), bytes.TrimSpace(data), nil
}
// Request more data.
return 0, nil, nil
})
return &CommaListScanner{r: s}
}
func (c *CommaListScanner) Scan() bool {
if c.r.Scan() {
c.text = c.r.Text()
return true
}
c.err = c.r.Err()
return false
}
func (c *CommaListScanner) Text() string {
return c.text
}
func (c *CommaListScanner) Err() error {
return c.err
}