UnmarshalStream

This commit is contained in:
Ian Gulliver
2023-07-23 08:44:01 -07:00
parent 8801e9e0db
commit 256711f7f8
2 changed files with 44 additions and 26 deletions

31
file.go
View File

@@ -1,7 +1,6 @@
package bkl
import (
"bytes"
"fmt"
"io"
"os"
@@ -38,35 +37,15 @@ func loadFile(path string) (*file, error) {
return nil, err
}
rawDocs := [][]byte{}
for {
if bytes.HasPrefix(raw, []byte("---\n")) {
rawDocs = append(rawDocs, []byte(""))
raw = bytes.TrimPrefix(raw, []byte("---\n"))
continue
}
parts := bytes.SplitN(raw, []byte("\n---\n"), 2)
if len(parts) == 1 {
rawDocs = append(rawDocs, raw)
break
}
rawDocs = append(rawDocs, append(parts[0], '\n'))
raw = parts[1]
docs, err := format.UnmarshalStream(raw)
if err != nil {
return nil, fmt.Errorf("%s: %w", path, err)
}
for i, rawDoc := range rawDocs {
doc, err := format.Unmarshal(rawDoc)
if err != nil {
return nil, fmt.Errorf("%s[doc%d]: %w", path, i, err)
}
for i, doc := range docs {
doc, err = normalize(doc)
if err != nil {
return nil, err
return nil, fmt.Errorf("[doc%d]: %w", i, err)
}
doc = env(doc)

View File

@@ -81,3 +81,42 @@ func (f *Format) Unmarshal(in []byte) (any, error) {
return obj, nil
}
func (f *Format) UnmarshalStream(in []byte) ([]any, error) {
ret := []any{}
for i, raw := range splitStream(in) {
doc, err := f.Unmarshal(raw)
if err != nil {
return nil, fmt.Errorf("[doc%d]: %w", i, err)
}
ret = append(ret, doc)
}
return ret, nil
}
func splitStream(in []byte) [][]byte {
ret := [][]byte{}
for {
if bytes.HasPrefix(in, []byte("---\n")) {
ret = append(ret, []byte(""))
in = bytes.TrimPrefix(in, []byte("---\n"))
continue
}
parts := bytes.SplitN(in, []byte("\n---\n"), 2)
if len(parts) == 1 {
ret = append(ret, in)
break
}
ret = append(ret, append(parts[0], '\n'))
in = parts[1]
}
return ret
}