UnmarshalStream
This commit is contained in:
31
file.go
31
file.go
@@ -1,7 +1,6 @@
|
|||||||
package bkl
|
package bkl
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
@@ -38,35 +37,15 @@ func loadFile(path string) (*file, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
rawDocs := [][]byte{}
|
docs, err := format.UnmarshalStream(raw)
|
||||||
|
if err != nil {
|
||||||
for {
|
return nil, fmt.Errorf("%s: %w", path, err)
|
||||||
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]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, rawDoc := range rawDocs {
|
for i, doc := range docs {
|
||||||
doc, err := format.Unmarshal(rawDoc)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("%s[doc%d]: %w", path, i, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
doc, err = normalize(doc)
|
doc, err = normalize(doc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("[doc%d]: %w", i, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
doc = env(doc)
|
doc = env(doc)
|
||||||
|
|||||||
39
formats.go
39
formats.go
@@ -81,3 +81,42 @@ func (f *Format) Unmarshal(in []byte) (any, error) {
|
|||||||
|
|
||||||
return obj, nil
|
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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user