Newer
Older
EnvoyControlPlane / internal / converter.go
package internal

import (
	"bytes"
	"encoding/json"
	"fmt"

	"google.golang.org/protobuf/encoding/protojson"
	"google.golang.org/protobuf/proto"
	yaml "gopkg.in/yaml.v3"
)

// ConvertProtoToYAML converts any protobuf message to a YAML string with 2-space indentation
func ConvertProtoToYAML(msg proto.Message) (string, error) {
	// 1. Marshal protobuf to JSON
	jsonBytes, err := protojson.Marshal(msg)
	if err != nil {
		return "", fmt.Errorf("failed to marshal proto to JSON: %w", err)
	}

	// 2. Unmarshal JSON into a generic Go map
	var obj interface{}
	if err := json.Unmarshal(jsonBytes, &obj); err != nil {
		return "", fmt.Errorf("failed to unmarshal JSON: %w", err)
	}

	// 3. Marshal the map to YAML with 2-space indentation
	var buf bytes.Buffer
	encoder := yaml.NewEncoder(&buf)
	encoder.SetIndent(2) // set indentation to 2 spaces
	if err := encoder.Encode(obj); err != nil {
		return "", fmt.Errorf("failed to encode YAML: %w", err)
	}
	encoder.Close()

	return buf.String(), nil
}