diff --git a/cli/command/checkpoint/formatter.go b/cli/command/checkpoint/formatter.go index 2bc579dd7..915ce1832 100644 --- a/cli/command/checkpoint/formatter.go +++ b/cli/command/checkpoint/formatter.go @@ -20,15 +20,21 @@ func newFormat(source string) formatter.Format { // formatWrite writes formatted checkpoints using the Context func formatWrite(fmtCtx formatter.Context, checkpoints []checkpoint.Summary) error { - render := func(format func(subContext formatter.SubContext) error) error { + cpContext := &checkpointContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "Name": checkpointNameHeader, + }, + }, + } + return fmtCtx.Write(cpContext, func(format func(subContext formatter.SubContext) error) error { for _, cp := range checkpoints { if err := format(&checkpointContext{c: cp}); err != nil { return err } } return nil - } - return fmtCtx.Write(newCheckpointContext(), render) + }) } type checkpointContext struct { @@ -36,14 +42,6 @@ type checkpointContext struct { c checkpoint.Summary } -func newCheckpointContext() *checkpointContext { - cpCtx := checkpointContext{} - cpCtx.Header = formatter.SubHeaderContext{ - "Name": checkpointNameHeader, - } - return &cpCtx -} - func (c *checkpointContext) MarshalJSON() ([]byte, error) { return formatter.MarshalJSON(c) } diff --git a/cli/command/config/formatter.go b/cli/command/config/formatter.go index f214c961f..14355c7ba 100644 --- a/cli/command/config/formatter.go +++ b/cli/command/config/formatter.go @@ -45,7 +45,18 @@ func newFormat(source string, quiet bool) formatter.Format { // formatWrite writes the context func formatWrite(fmtCtx formatter.Context, configs []swarm.Config) error { - render := func(format func(subContext formatter.SubContext) error) error { + cCtx := &configContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "ID": configIDHeader, + "Name": formatter.NameHeader, + "CreatedAt": configCreatedHeader, + "UpdatedAt": configUpdatedHeader, + "Labels": formatter.LabelsHeader, + }, + }, + } + return fmtCtx.Write(cCtx, func(format func(subContext formatter.SubContext) error) error { for _, config := range configs { configCtx := &configContext{c: config} if err := format(configCtx); err != nil { @@ -53,21 +64,7 @@ func formatWrite(fmtCtx formatter.Context, configs []swarm.Config) error { } } return nil - } - return fmtCtx.Write(newConfigContext(), render) -} - -func newConfigContext() *configContext { - cCtx := &configContext{} - - cCtx.Header = formatter.SubHeaderContext{ - "ID": configIDHeader, - "Name": formatter.NameHeader, - "CreatedAt": configCreatedHeader, - "UpdatedAt": configUpdatedHeader, - "Labels": formatter.LabelsHeader, - } - return cCtx + }) } type configContext struct { @@ -119,7 +116,7 @@ func inspectFormatWrite(fmtCtx formatter.Context, refs []string, getRef inspect. if fmtCtx.Format != configInspectPrettyTemplate { return inspect.Inspect(fmtCtx.Output, refs, string(fmtCtx.Format), getRef) } - render := func(format func(subContext formatter.SubContext) error) error { + return fmtCtx.Write(&configInspectContext{}, func(format func(subContext formatter.SubContext) error) error { for _, ref := range refs { configI, _, err := getRef(ref) if err != nil { @@ -134,8 +131,7 @@ func inspectFormatWrite(fmtCtx formatter.Context, refs []string, getRef inspect. } } return nil - } - return fmtCtx.Write(&configInspectContext{}, render) + }) } type configInspectContext struct { diff --git a/cli/command/image/formatter_history.go b/cli/command/image/formatter_history.go index 0add567b3..bb2c5c98c 100644 --- a/cli/command/image/formatter_history.go +++ b/cli/command/image/formatter_history.go @@ -37,25 +37,30 @@ func newHistoryFormat(source string, quiet bool, human bool) formatter.Format { // historyWrite writes the context func historyWrite(fmtCtx formatter.Context, human bool, histories []image.HistoryResponseItem) error { - render := func(format func(subContext formatter.SubContext) error) error { + historyCtx := &historyContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "ID": historyIDHeader, + "CreatedSince": formatter.CreatedSinceHeader, + "CreatedAt": formatter.CreatedAtHeader, + "CreatedBy": createdByHeader, + "Size": formatter.SizeHeader, + "Comment": commentHeader, + }, + }, + } + return fmtCtx.Write(historyCtx, func(format func(subContext formatter.SubContext) error) error { for _, history := range histories { - historyCtx := &historyContext{trunc: fmtCtx.Trunc, h: history, human: human} - if err := format(historyCtx); err != nil { + if err := format(&historyContext{ + trunc: fmtCtx.Trunc, + h: history, + human: human, + }); err != nil { return err } } return nil - } - historyCtx := &historyContext{} - historyCtx.Header = formatter.SubHeaderContext{ - "ID": historyIDHeader, - "CreatedSince": formatter.CreatedSinceHeader, - "CreatedAt": formatter.CreatedAtHeader, - "CreatedBy": createdByHeader, - "Size": formatter.SizeHeader, - "Comment": commentHeader, - } - return fmtCtx.Write(historyCtx, render) + }) } type historyContext struct { diff --git a/cli/command/network/formatter.go b/cli/command/network/formatter.go index f45682000..8f67c7fa4 100644 --- a/cli/command/network/formatter.go +++ b/cli/command/network/formatter.go @@ -36,28 +36,32 @@ func newFormat(source string, quiet bool) formatter.Format { // formatWrite writes the context. func formatWrite(fmtCtx formatter.Context, networks []network.Summary) error { - render := func(format func(subContext formatter.SubContext) error) error { + networkCtx := networkContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "ID": networkIDHeader, + "Name": formatter.NameHeader, + "Driver": formatter.DriverHeader, + "Scope": formatter.ScopeHeader, + "IPv4": ipv4Header, + "IPv6": ipv6Header, + "Internal": internalHeader, + "Labels": formatter.LabelsHeader, + "CreatedAt": formatter.CreatedAtHeader, + }, + }, + } + return fmtCtx.Write(&networkCtx, func(format func(subContext formatter.SubContext) error) error { for _, nw := range networks { - networkCtx := &networkContext{trunc: fmtCtx.Trunc, n: nw} - if err := format(networkCtx); err != nil { + if err := format(&networkContext{ + trunc: fmtCtx.Trunc, + n: nw, + }); err != nil { return err } } return nil - } - networkCtx := networkContext{} - networkCtx.Header = formatter.SubHeaderContext{ - "ID": networkIDHeader, - "Name": formatter.NameHeader, - "Driver": formatter.DriverHeader, - "Scope": formatter.ScopeHeader, - "IPv4": ipv4Header, - "IPv6": ipv6Header, - "Internal": internalHeader, - "Labels": formatter.LabelsHeader, - "CreatedAt": formatter.CreatedAtHeader, - } - return fmtCtx.Write(&networkCtx, render) + }) } type networkContext struct { diff --git a/cli/command/node/formatter.go b/cli/command/node/formatter.go index 3ba5b0f8e..fd7e97daf 100644 --- a/cli/command/node/formatter.go +++ b/cli/command/node/formatter.go @@ -100,27 +100,31 @@ func newFormat(source string, quiet bool) formatter.Format { // formatWrite writes the context. func formatWrite(fmtCtx formatter.Context, nodes []swarm.Node, info system.Info) error { - render := func(format func(subContext formatter.SubContext) error) error { + nodeCtx := &nodeContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "ID": nodeIDHeader, + "Self": selfHeader, + "Hostname": hostnameHeader, + "Status": formatter.StatusHeader, + "Availability": availabilityHeader, + "ManagerStatus": managerStatusHeader, + "EngineVersion": engineVersionHeader, + "TLSStatus": tlsStatusHeader, + }, + }, + } + return fmtCtx.Write(nodeCtx, func(format func(subContext formatter.SubContext) error) error { for _, node := range nodes { - nodeCtx := &nodeContext{n: node, info: info} - if err := format(nodeCtx); err != nil { + if err := format(&nodeContext{ + n: node, + info: info, + }); err != nil { return err } } return nil - } - nodeCtx := nodeContext{} - nodeCtx.Header = formatter.SubHeaderContext{ - "ID": nodeIDHeader, - "Self": selfHeader, - "Hostname": hostnameHeader, - "Status": formatter.StatusHeader, - "Availability": availabilityHeader, - "ManagerStatus": managerStatusHeader, - "EngineVersion": engineVersionHeader, - "TLSStatus": tlsStatusHeader, - } - return fmtCtx.Write(&nodeCtx, render) + }) } type nodeContext struct { @@ -184,7 +188,7 @@ func inspectFormatWrite(fmtCtx formatter.Context, refs []string, getRef inspect. if fmtCtx.Format != nodeInspectPrettyTemplate { return inspect.Inspect(fmtCtx.Output, refs, string(fmtCtx.Format), getRef) } - render := func(format func(subContext formatter.SubContext) error) error { + return fmtCtx.Write(&nodeInspectContext{}, func(format func(subContext formatter.SubContext) error) error { for _, ref := range refs { nodeI, _, err := getRef(ref) if err != nil { @@ -199,8 +203,7 @@ func inspectFormatWrite(fmtCtx formatter.Context, refs []string, getRef inspect. } } return nil - } - return fmtCtx.Write(&nodeInspectContext{}, render) + }) } type nodeInspectContext struct { diff --git a/cli/command/plugin/formatter.go b/cli/command/plugin/formatter.go index 8cf83018b..2dc3f5aeb 100644 --- a/cli/command/plugin/formatter.go +++ b/cli/command/plugin/formatter.go @@ -39,24 +39,28 @@ func newFormat(source string, quiet bool) formatter.Format { // formatWrite writes the context func formatWrite(fmtCtx formatter.Context, plugins []*plugin.Plugin) error { - render := func(format func(subContext formatter.SubContext) error) error { + pluginCtx := &pluginContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "ID": pluginIDHeader, + "Name": formatter.NameHeader, + "Description": formatter.DescriptionHeader, + "Enabled": enabledHeader, + "PluginReference": formatter.ImageHeader, + }, + }, + } + return fmtCtx.Write(pluginCtx, func(format func(subContext formatter.SubContext) error) error { for _, p := range plugins { - pluginCtx := &pluginContext{trunc: fmtCtx.Trunc, p: *p} - if err := format(pluginCtx); err != nil { + if err := format(&pluginContext{ + trunc: fmtCtx.Trunc, + p: *p, + }); err != nil { return err } } return nil - } - pluginCtx := pluginContext{} - pluginCtx.Header = formatter.SubHeaderContext{ - "ID": pluginIDHeader, - "Name": formatter.NameHeader, - "Description": formatter.DescriptionHeader, - "Enabled": enabledHeader, - "PluginReference": formatter.ImageHeader, - } - return fmtCtx.Write(&pluginCtx, render) + }) } type pluginContext struct { diff --git a/cli/command/registry/formatter_search.go b/cli/command/registry/formatter_search.go index 4a49f9dea..c7cd0c85a 100644 --- a/cli/command/registry/formatter_search.go +++ b/cli/command/registry/formatter_search.go @@ -27,23 +27,27 @@ func newFormat(source string) formatter.Format { // formatWrite writes the context. func formatWrite(fmtCtx formatter.Context, results []registrytypes.SearchResult) error { - render := func(format func(subContext formatter.SubContext) error) error { + searchCtx := &searchContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "Name": formatter.NameHeader, + "Description": formatter.DescriptionHeader, + "StarCount": starsHeader, + "IsOfficial": officialHeader, + }, + }, + } + return fmtCtx.Write(searchCtx, func(format func(subContext formatter.SubContext) error) error { for _, result := range results { - searchCtx := &searchContext{trunc: fmtCtx.Trunc, s: result} - if err := format(searchCtx); err != nil { + if err := format(&searchContext{ + trunc: fmtCtx.Trunc, + s: result, + }); err != nil { return err } } return nil - } - searchCtx := searchContext{} - searchCtx.Header = formatter.SubHeaderContext{ - "Name": formatter.NameHeader, - "Description": formatter.DescriptionHeader, - "StarCount": starsHeader, - "IsOfficial": officialHeader, - } - return fmtCtx.Write(&searchCtx, render) + }) } type searchContext struct { diff --git a/cli/command/secret/formatter.go b/cli/command/secret/formatter.go index d5978a001..a71d30f8a 100644 --- a/cli/command/secret/formatter.go +++ b/cli/command/secret/formatter.go @@ -44,7 +44,19 @@ func newFormat(source string, quiet bool) formatter.Format { // formatWrite writes the context func formatWrite(fmtCtx formatter.Context, secrets []swarm.Secret) error { - render := func(format func(subContext formatter.SubContext) error) error { + sCtx := &secretContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "ID": secretIDHeader, + "Name": formatter.NameHeader, + "Driver": formatter.DriverHeader, + "CreatedAt": secretCreatedHeader, + "UpdatedAt": secretUpdatedHeader, + "Labels": formatter.LabelsHeader, + }, + }, + } + return fmtCtx.Write(sCtx, func(format func(subContext formatter.SubContext) error) error { for _, secret := range secrets { secretCtx := &secretContext{s: secret} if err := format(secretCtx); err != nil { @@ -52,22 +64,7 @@ func formatWrite(fmtCtx formatter.Context, secrets []swarm.Secret) error { } } return nil - } - return fmtCtx.Write(newSecretContext(), render) -} - -func newSecretContext() *secretContext { - sCtx := &secretContext{} - - sCtx.Header = formatter.SubHeaderContext{ - "ID": secretIDHeader, - "Name": formatter.NameHeader, - "Driver": formatter.DriverHeader, - "CreatedAt": secretCreatedHeader, - "UpdatedAt": secretUpdatedHeader, - "Labels": formatter.LabelsHeader, - } - return sCtx + }) } type secretContext struct { @@ -126,7 +123,7 @@ func inspectFormatWrite(fmtCtx formatter.Context, refs []string, getRef inspect. if fmtCtx.Format != secretInspectPrettyTemplate { return inspect.Inspect(fmtCtx.Output, refs, string(fmtCtx.Format), getRef) } - render := func(format func(subContext formatter.SubContext) error) error { + return fmtCtx.Write(&secretInspectContext{}, func(format func(subContext formatter.SubContext) error) error { for _, ref := range refs { secretI, _, err := getRef(ref) if err != nil { @@ -141,8 +138,7 @@ func inspectFormatWrite(fmtCtx formatter.Context, refs []string, getRef inspect. } } return nil - } - return fmtCtx.Write(&secretInspectContext{}, render) + }) } type secretInspectContext struct { diff --git a/cli/command/service/formatter.go b/cli/command/service/formatter.go index c87f2624e..bb15ff16d 100644 --- a/cli/command/service/formatter.go +++ b/cli/command/service/formatter.go @@ -222,7 +222,8 @@ func inspectFormatWrite(fmtCtx formatter.Context, refs []string, getRef, getNetw if fmtCtx.Format != serviceInspectPrettyTemplate { return inspect.Inspect(fmtCtx.Output, refs, string(fmtCtx.Format), getRef) } - render := func(format func(subContext formatter.SubContext) error) error { + + return fmtCtx.Write(&serviceInspectContext{}, func(format func(subContext formatter.SubContext) error) error { for _, ref := range refs { serviceI, _, err := getRef(ref) if err != nil { @@ -232,13 +233,15 @@ func inspectFormatWrite(fmtCtx formatter.Context, refs []string, getRef, getNetw if !ok { return errors.Errorf("got wrong object to inspect") } - if err := format(&serviceInspectContext{Service: service, networkNames: resolveNetworks(service, getNetwork)}); err != nil { + if err := format(&serviceInspectContext{ + Service: service, + networkNames: resolveNetworks(service, getNetwork), + }); err != nil { return err } } return nil - } - return fmtCtx.Write(&serviceInspectContext{}, render) + }) } type serviceInspectContext struct { diff --git a/cli/command/task/formatter.go b/cli/command/task/formatter.go index 51a19d993..023027f39 100644 --- a/cli/command/task/formatter.go +++ b/cli/command/task/formatter.go @@ -41,27 +41,33 @@ func newTaskFormat(source string, quiet bool) formatter.Format { // formatWrite writes the context. func formatWrite(fmtCtx formatter.Context, tasks []swarm.Task, names map[string]string, nodes map[string]string) error { - render := func(format func(subContext formatter.SubContext) error) error { + taskCtx := &taskContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "ID": taskIDHeader, + "Name": formatter.NameHeader, + "Image": formatter.ImageHeader, + "Node": nodeHeader, + "DesiredState": desiredStateHeader, + "CurrentState": currentStateHeader, + "Error": formatter.ErrorHeader, + "Ports": formatter.PortsHeader, + }, + }, + } + return fmtCtx.Write(taskCtx, func(format func(subContext formatter.SubContext) error) error { for _, task := range tasks { - taskCtx := &taskContext{trunc: fmtCtx.Trunc, task: task, name: names[task.ID], node: nodes[task.ID]} - if err := format(taskCtx); err != nil { + if err := format(&taskContext{ + trunc: fmtCtx.Trunc, + task: task, + name: names[task.ID], + node: nodes[task.ID], + }); err != nil { return err } } return nil - } - taskCtx := taskContext{} - taskCtx.Header = formatter.SubHeaderContext{ - "ID": taskIDHeader, - "Name": formatter.NameHeader, - "Image": formatter.ImageHeader, - "Node": nodeHeader, - "DesiredState": desiredStateHeader, - "CurrentState": currentStateHeader, - "Error": formatter.ErrorHeader, - "Ports": formatter.PortsHeader, - } - return fmtCtx.Write(&taskCtx, render) + }) } type taskContext struct { diff --git a/cli/command/trust/formatter.go b/cli/command/trust/formatter.go index b3f8f1a5a..13e5712a2 100644 --- a/cli/command/trust/formatter.go +++ b/cli/command/trust/formatter.go @@ -37,21 +37,23 @@ type signerInfo struct { // tagWrite writes the context func tagWrite(fmtCtx formatter.Context, signedTagInfoList []signedTagInfo) error { - render := func(format func(subContext formatter.SubContext) error) error { + trustTagCtx := &trustTagContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "SignedTag": signedTagNameHeader, + "Digest": trustedDigestHeader, + "Signers": signersHeader, + }, + }, + } + return fmtCtx.Write(trustTagCtx, func(format func(subContext formatter.SubContext) error) error { for _, signedTag := range signedTagInfoList { if err := format(&trustTagContext{s: signedTag}); err != nil { return err } } return nil - } - trustTagCtx := trustTagContext{} - trustTagCtx.Header = formatter.SubHeaderContext{ - "SignedTag": signedTagNameHeader, - "Digest": trustedDigestHeader, - "Signers": signersHeader, - } - return fmtCtx.Write(&trustTagCtx, render) + }) } type trustTagContext struct { @@ -77,23 +79,25 @@ func (c *trustTagContext) Signers() string { // signerInfoWrite writes the context. func signerInfoWrite(fmtCtx formatter.Context, signerInfoList []signerInfo) error { - render := func(format func(subContext formatter.SubContext) error) error { - for _, signerInfo := range signerInfoList { + signerInfoCtx := &signerInfoContext{ + HeaderContext: formatter.HeaderContext{ + Header: formatter.SubHeaderContext{ + "Signer": signerNameHeader, + "Keys": keysHeader, + }, + }, + } + return fmtCtx.Write(signerInfoCtx, func(format func(subContext formatter.SubContext) error) error { + for _, info := range signerInfoList { if err := format(&signerInfoContext{ trunc: fmtCtx.Trunc, - s: signerInfo, + s: info, }); err != nil { return err } } return nil - } - signerInfoCtx := signerInfoContext{} - signerInfoCtx.Header = formatter.SubHeaderContext{ - "Signer": signerNameHeader, - "Keys": keysHeader, - } - return fmtCtx.Write(&signerInfoCtx, render) + }) } type signerInfoContext struct {