func()

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
}