package yamlfmt import ( "bytes" "sigs.k8s.io/kustomize/kyaml/kio" "edge-infra.dev/pkg/edge/gitops/fns/normalizer" "edge-infra.dev/pkg/edge/gitops/fns/trimmer" ) type FormatterOption func(*ByteFormatter) func WithFilterFunc(f kio.FilterFunc) FormatterOption { return func(bf *ByteFormatter) { bf.filterFuncs = append(bf.filterFuncs, f) } } func makeOptions(bf *ByteFormatter, opts ...FormatterOption) { for _, opt := range opts { opt(bf) } } func makeDefaults(bf *ByteFormatter) { bf.normalizer = normalizer.Normalizer{} bf.trimmer = trimmer.Trimmer{} } type ByteFormatter struct { normalizer normalizer.Normalizer trimmer trimmer.Trimmer readWriter kio.ByteReadWriter filterFuncs []kio.FilterFunc } func NewByteFormatter() *ByteFormatter { bf := &ByteFormatter{ readWriter: kio.ByteReadWriter{}, } makeDefaults(bf) makeOptions(bf) return bf } func (bf *ByteFormatter) FormatBytes(b []byte) ([]byte, error) { var in, out bytes.Buffer _, err := in.Write(b) if err != nil { return nil, err } bf.readWriter.Reader = &in bf.readWriter.Writer = &out err = kio.Pipeline{ Inputs: []kio.Reader{&bf.readWriter}, Outputs: []kio.Writer{&bf.readWriter}, Filters: []kio.Filter{ kio.FilterFunc(bf.trimmer.Run), kio.FilterFunc(bf.normalizer.Run), }, }.Execute() if err != nil { return nil, err } return out.Bytes(), nil }