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 }