github.com/defang-io/defang/src@v0.0.0-20240505002154-bdf411911834/pkg/cli/common.go (about)

     1  package cli
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  
     8  	"google.golang.org/protobuf/encoding/protojson"
     9  	"google.golang.org/protobuf/proto"
    10  	"gopkg.in/yaml.v3"
    11  )
    12  
    13  var (
    14  	DoDryRun = false
    15  
    16  	ErrDryRun = errors.New("dry run")
    17  )
    18  
    19  func MarshalPretty(root string, data proto.Message) ([]byte, error) {
    20  	// HACK: convert to JSON first so we respect the json tags (like "omitempty")
    21  	bytes, err := protojson.Marshal(data)
    22  	if err != nil {
    23  		return nil, err
    24  	}
    25  	var raw map[string]interface{} // TODO: this messes with the order of the fields
    26  	if err := json.Unmarshal(bytes, &raw); err != nil {
    27  		return nil, err
    28  	}
    29  	if root != "" {
    30  		raw = map[string]interface{}{root: raw}
    31  	}
    32  	return yaml.Marshal(raw)
    33  }
    34  
    35  func PrintObject(root string, data proto.Message) error {
    36  	bytes, err := MarshalPretty(root, data)
    37  	if err != nil {
    38  		return err
    39  	}
    40  	// TODO: add color
    41  	fmt.Println(string(bytes))
    42  	return nil
    43  }