github.com/goreleaser/goreleaser@v1.25.1/internal/yaml/yaml.go (about) 1 // Package yaml wraps gopkg.in/yaml.v3 and helps transition from v2. 2 package yaml 3 4 import ( 5 "bytes" 6 "errors" 7 "io" 8 9 yaml "gopkg.in/yaml.v3" 10 ) 11 12 // UnmarshalStrict unmarshals a YAML document with strict behavior (only declared fields are tolerated). 13 func UnmarshalStrict(in []byte, out interface{}) error { 14 decoder := yaml.NewDecoder(bytes.NewReader(in)) 15 decoder.KnownFields(true) 16 17 return handleErr(decoder.Decode(out)) 18 } 19 20 // Unmarshal some struct as a YAML document, without strict behavior. 21 func Unmarshal(in []byte, out interface{}) error { 22 decoder := yaml.NewDecoder(bytes.NewReader(in)) 23 decoder.KnownFields(false) 24 25 return handleErr(decoder.Decode(out)) 26 } 27 28 // Marshal some struct as a YAML document. 29 func Marshal(in interface{}) ([]byte, error) { 30 b := new(bytes.Buffer) 31 encoder := yaml.NewEncoder(b) 32 encoder.SetIndent(2) // default is 4 33 34 if err := encoder.Encode(in); err != nil { 35 encoder.Close() 36 37 return nil, err 38 } 39 40 encoder.Close() 41 42 return b.Bytes(), nil 43 } 44 45 // handleErr mutes io.EOF errors for backward-compatibility. 46 func handleErr(err error) error { 47 if err != nil && !errors.Is(err, io.EOF) { 48 return err 49 } 50 51 return nil 52 }