...
1
16
17 package output
18
19 import (
20 "encoding/json"
21 "fmt"
22 "io"
23
24 "github.com/gosuri/uitable"
25 "github.com/pkg/errors"
26 "sigs.k8s.io/yaml"
27 )
28
29
30 type Format string
31
32 const (
33 Table Format = "table"
34 JSON Format = "json"
35 YAML Format = "yaml"
36 )
37
38
39 func Formats() []string {
40 return []string{Table.String(), JSON.String(), YAML.String()}
41 }
42
43
44
45 func FormatsWithDesc() map[string]string {
46 return map[string]string{
47 Table.String(): "Output result in human-readable format",
48 JSON.String(): "Output result in JSON format",
49 YAML.String(): "Output result in YAML format",
50 }
51 }
52
53
54 var ErrInvalidFormatType = fmt.Errorf("invalid format type")
55
56
57 func (o Format) String() string {
58 return string(o)
59 }
60
61
62
63 func (o Format) Write(out io.Writer, w Writer) error {
64 switch o {
65 case Table:
66 return w.WriteTable(out)
67 case JSON:
68 return w.WriteJSON(out)
69 case YAML:
70 return w.WriteYAML(out)
71 }
72 return ErrInvalidFormatType
73 }
74
75
76
77 func ParseFormat(s string) (out Format, err error) {
78 switch s {
79 case Table.String():
80 out, err = Table, nil
81 case JSON.String():
82 out, err = JSON, nil
83 case YAML.String():
84 out, err = YAML, nil
85 default:
86 out, err = "", ErrInvalidFormatType
87 }
88 return
89 }
90
91
92 type Writer interface {
93
94
95 WriteTable(out io.Writer) error
96
97
98 WriteJSON(out io.Writer) error
99
100
101 WriteYAML(out io.Writer) error
102 }
103
104
105
106 func EncodeJSON(out io.Writer, obj interface{}) error {
107 enc := json.NewEncoder(out)
108 err := enc.Encode(obj)
109 if err != nil {
110 return errors.Wrap(err, "unable to write JSON output")
111 }
112 return nil
113 }
114
115
116
117 func EncodeYAML(out io.Writer, obj interface{}) error {
118 raw, err := yaml.Marshal(obj)
119 if err != nil {
120 return errors.Wrap(err, "unable to write YAML output")
121 }
122
123 _, err = out.Write(raw)
124 if err != nil {
125 return errors.Wrap(err, "unable to write YAML output")
126 }
127 return nil
128 }
129
130
131
132 func EncodeTable(out io.Writer, table *uitable.Table) error {
133 raw := table.Bytes()
134 raw = append(raw, []byte("\n")...)
135 _, err := out.Write(raw)
136 if err != nil {
137 return errors.Wrap(err, "unable to write table output")
138 }
139 return nil
140 }
141
View as plain text