github.com/supabase/cli@v1.168.1/internal/utils/output.go (about)

     1  package utils
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  
     8  	"github.com/BurntSushi/toml"
     9  	"github.com/go-errors/errors"
    10  	"github.com/joho/godotenv"
    11  	"gopkg.in/yaml.v3"
    12  )
    13  
    14  const (
    15  	OutputEnv    = "env"
    16  	OutputJson   = "json"
    17  	OutputPretty = "pretty"
    18  	OutputToml   = "toml"
    19  	OutputYaml   = "yaml"
    20  
    21  	// OutputMetadata is used with certain SSO commands only.
    22  	OutputMetadata = "metadata"
    23  )
    24  
    25  var (
    26  	OutputDefaultAllowed = []string{
    27  		OutputPretty,
    28  		OutputJson,
    29  		OutputToml,
    30  		OutputYaml,
    31  	}
    32  )
    33  
    34  func EncodeOutput(format string, w io.Writer, value any) error {
    35  	switch format {
    36  	case OutputEnv:
    37  		mapvalue, ok := value.(map[string]string)
    38  		if !ok {
    39  			return errors.Errorf("value is not a map[string]string and can't be encoded as an environment file")
    40  		}
    41  
    42  		out, err := godotenv.Marshal(mapvalue)
    43  		if err != nil {
    44  			return errors.Errorf("failed to marshal env map: %w", err)
    45  		}
    46  
    47  		if _, err := fmt.Fprintln(w, out); err != nil {
    48  			return errors.Errorf("failed to write encoded output: %w", err)
    49  		}
    50  
    51  	case OutputJson:
    52  		enc := json.NewEncoder(w)
    53  		enc.SetIndent("", "  ")
    54  
    55  		if err := enc.Encode(value); err != nil {
    56  			return errors.Errorf("failed to output json: %w", err)
    57  		}
    58  
    59  	case OutputYaml:
    60  		enc := yaml.NewEncoder(w)
    61  		if err := enc.Encode(value); err != nil {
    62  			return errors.Errorf("failed to output yaml: %w", err)
    63  		}
    64  
    65  	case OutputToml:
    66  		enc := toml.NewEncoder(w)
    67  		if err := enc.Encode(value); err != nil {
    68  			return errors.Errorf("failed to output toml: %w", err)
    69  		}
    70  
    71  	default:
    72  		return errors.Errorf("Unsupported output encoding %q", format)
    73  	}
    74  	return nil
    75  }