Added "json" as specific value for --format flag in list commands, as an alias to `{{json .}}`

Signed-off-by: Silvin Lubecki <silvin.lubecki@docker.com>
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Silvin Lubecki 2021-01-18 17:09:21 +01:00 committed by Sebastiaan van Stijn
parent 84d47b544e
commit eb27a94c3f
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
2 changed files with 79 additions and 2 deletions

View File

@ -16,8 +16,10 @@ const (
TableFormatKey = "table" TableFormatKey = "table"
RawFormatKey = "raw" RawFormatKey = "raw"
PrettyFormatKey = "pretty" PrettyFormatKey = "pretty"
JSONFormatKey = "json"
DefaultQuietFormat = "{{.ID}}" DefaultQuietFormat = "{{.ID}}"
jsonFormat = "{{json .}}"
) )
// Format is the format string rendered using the Context // Format is the format string rendered using the Context
@ -28,6 +30,11 @@ func (f Format) IsTable() bool {
return strings.HasPrefix(string(f), TableFormatKey) return strings.HasPrefix(string(f), TableFormatKey)
} }
// IsJSON returns true if the format is the json format
func (f Format) IsJSON() bool {
return string(f) == JSONFormatKey
}
// Contains returns true if the format contains the substring // Contains returns true if the format contains the substring
func (f Format) Contains(sub string) bool { func (f Format) Contains(sub string) bool {
return strings.Contains(string(f), sub) return strings.Contains(string(f), sub)
@ -50,10 +57,12 @@ type Context struct {
func (c *Context) preFormat() { func (c *Context) preFormat() {
c.finalFormat = string(c.Format) c.finalFormat = string(c.Format)
// TODO: handle this in the Format type // TODO: handle this in the Format type
if c.Format.IsTable() { switch {
case c.Format.IsTable():
c.finalFormat = c.finalFormat[len(TableFormatKey):] c.finalFormat = c.finalFormat[len(TableFormatKey):]
case c.Format.IsJSON():
c.finalFormat = jsonFormat
} }
c.finalFormat = strings.Trim(c.finalFormat, " ") c.finalFormat = strings.Trim(c.finalFormat, " ")

View File

@ -0,0 +1,68 @@
package formatter
import (
"bytes"
"testing"
"gotest.tools/v3/assert"
)
func TestFormat(t *testing.T) {
f := Format("json")
assert.Assert(t, f.IsJSON())
assert.Assert(t, !f.IsTable())
f = Format("table")
assert.Assert(t, !f.IsJSON())
assert.Assert(t, f.IsTable())
f = Format("other")
assert.Assert(t, !f.IsJSON())
assert.Assert(t, !f.IsTable())
}
type fakeSubContext struct {
Name string
}
func (f fakeSubContext) FullHeader() interface{} {
return map[string]string{"Name": "NAME"}
}
func TestContext(t *testing.T) {
testCases := []struct {
name string
format string
expected string
}{
{
name: "json format",
format: JSONFormatKey,
expected: `{"Name":"test"}
`,
},
{
name: "table format",
format: `table {{.Name}}`,
expected: `NAME
test
`,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
buf := bytes.NewBuffer(nil)
ctx := Context{
Format: Format(tc.format),
Output: buf,
}
subContext := fakeSubContext{Name: "test"}
subFormat := func(f func(sub SubContext) error) error {
return f(subContext)
}
err := ctx.Write(&subContext, subFormat)
assert.NilError(t, err)
assert.Equal(t, buf.String(), tc.expected)
})
}
}