···1313// the first file is returned as the second value. If an error occurs while
1414// parsing, it returns all files parsed before the error.
1515func Parse(r io.Reader) ([]*File, string, error) {
1616- p := &parser{r: bufio.NewReader(r)}
1616+ p := newParser(r)
1717+1718 if err := p.Next(); err != nil {
1819 if err == io.EOF {
1920 return nil, "", nil
···6667// - if returning an object, advance to the first line after the object
6768// - any exported parsing methods must initialize the parser by calling Next()
68697070+type stringReader interface {
7171+ ReadString(delim byte) (string, error)
7272+}
7373+6974type parser struct {
7070- r *bufio.Reader
7575+ r stringReader
71767277 eof bool
7378 lineno int64
7479 lines [3]string
8080+}
8181+8282+func newParser(r io.Reader) *parser {
8383+ if r, ok := r.(stringReader); ok {
8484+ return &parser{r: r}
8585+ }
8686+ return &parser{r: bufio.NewReader(r)}
7587}
76887789// Next advances the parser by one line. It returns any error encountered while