mirror of
https://github.com/1f349/lotus.git
synced 2024-12-22 16:14:07 +00:00
58 lines
1.1 KiB
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
|
|
}
|