Merge pull request #6338 from thaJeztah/cleanup_formatters

cli/command: inline vars and use struct literals in formatting functions
This commit is contained in:
Sebastiaan van Stijn
2025-08-22 12:25:14 +02:00
committed by GitHub
11 changed files with 187 additions and 164 deletions

View File

@ -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)
}

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {