parse.go 637 B

123456789101112131415161718192021222324
  1. package manifest
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. )
  7. // try parsing as a 2822 manifest, but fallback to line-based if that fails
  8. func Parse(reader io.Reader) (*Manifest2822, error) {
  9. buf := &bytes.Buffer{}
  10. // try parsing as 2822, but also copy back into a new buffer so that if it fails, we can re-parse as line-based
  11. manifest, err2822 := Parse2822(io.TeeReader(reader, buf))
  12. if err2822 != nil {
  13. manifest, err := ParseLineBased(buf)
  14. if err != nil {
  15. return nil, fmt.Errorf("cannot parse manifest in either format:\nRFC 2822 error: %v\nLine-based error: %v", err2822, err)
  16. }
  17. return manifest, nil
  18. }
  19. return manifest, nil
  20. }