66 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
package yaml
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"io"
 | 
						|
 | 
						|
	v2 "go.yaml.in/yaml/v2"
 | 
						|
	v3 "go.yaml.in/yaml/v3"
 | 
						|
 | 
						|
	"github.com/helmfile/helmfile/pkg/runtime"
 | 
						|
)
 | 
						|
 | 
						|
type Encoder interface {
 | 
						|
	Encode(any) error
 | 
						|
	Close() error
 | 
						|
}
 | 
						|
 | 
						|
// NewEncoder creates and returns a function that is used to encode a Go object to a YAML document
 | 
						|
func NewEncoder(w io.Writer) Encoder {
 | 
						|
	if runtime.GoYamlV3 {
 | 
						|
		v3Encoder := v3.NewEncoder(w)
 | 
						|
		v3Encoder.SetIndent(2)
 | 
						|
		return v3Encoder
 | 
						|
	}
 | 
						|
	return v2.NewEncoder(w)
 | 
						|
}
 | 
						|
 | 
						|
func Marshal(v any) ([]byte, error) {
 | 
						|
	var b bytes.Buffer
 | 
						|
	yamlEncoder := NewEncoder(&b)
 | 
						|
	err := yamlEncoder.Encode(v)
 | 
						|
	defer func() {
 | 
						|
		_ = yamlEncoder.Close()
 | 
						|
	}()
 | 
						|
	return b.Bytes(), err
 | 
						|
}
 | 
						|
 | 
						|
// NewDecoder creates and returns a function that is used to decode a YAML document
 | 
						|
// contained within the YAML document stream per each call.
 | 
						|
// When strict is true, this function ensures that every field found in the YAML document
 | 
						|
// to have the corresponding field in the decoded Go struct.
 | 
						|
func NewDecoder(data []byte, strict bool) func(any) error {
 | 
						|
	if runtime.GoYamlV3 {
 | 
						|
		decoder := v3.NewDecoder(bytes.NewReader(data))
 | 
						|
		decoder.KnownFields(strict)
 | 
						|
		return func(v any) error {
 | 
						|
			return decoder.Decode(v)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	decoder := v2.NewDecoder(bytes.NewReader(data))
 | 
						|
	decoder.SetStrict(strict)
 | 
						|
 | 
						|
	return func(v any) error {
 | 
						|
		return decoder.Decode(v)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func Unmarshal(data []byte, v any) error {
 | 
						|
	if runtime.GoYamlV3 {
 | 
						|
		return v3.Unmarshal(data, v)
 | 
						|
	}
 | 
						|
 | 
						|
	return v2.Unmarshal(data, v)
 | 
						|
}
 |