in api/proposal.go [151:196]
func (k *KEPHandler) Parse(in io.Reader) (*Proposal, error) {
scanner := bufio.NewScanner(in)
count := 0
metadata := []byte{}
var body bytes.Buffer
for scanner.Scan() {
line := scanner.Text() + "\n"
if strings.Contains(line, "---") {
count++
continue
}
if count == 1 {
metadata = append(metadata, []byte(line)...)
} else {
body.WriteString(line)
}
}
kep := &Proposal{
Contents: body.String(),
}
if err := scanner.Err(); err != nil {
return kep, errors.Wrap(err, "reading file")
}
// this file is just the KEP metadata
if count == 0 {
metadata = body.Bytes()
kep.Contents = ""
}
if err := yaml.UnmarshalStrict(metadata, &kep); err != nil {
k.Errors = append(k.Errors, errors.Wrap(err, "error unmarshalling YAML"))
return kep, errors.Wrap(err, "unmarshalling YAML")
}
if err := k.validateStruct(kep); err != nil {
k.Errors = append(k.Errors, err)
return kep, fmt.Errorf("validating KEP: %w", err)
}
kep.ID = hash(kep.OwningSIG + ":" + kep.Title)
return kep, nil
}