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  }