Files
docker-cli/cli/command/registry/formatter_search.go
Sebastiaan van Stijn e8cf8e65f7 cli/command/registry: deprecate NewSearchFormat, SearchWrite
It's part of the presentation logic of the cli, and only used internally.
We can consider providing utilities for these, but better as part of
separate packages.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
(cherry picked from commit 83371c2014)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2025-08-22 11:47:53 +02:00

108 lines
2.6 KiB
Go

package registry
import (
"strconv"
"strings"
"github.com/docker/cli/cli/command/formatter"
registrytypes "github.com/docker/docker/api/types/registry"
)
const (
defaultSearchTableFormat = "table {{.Name}}\t{{.Description}}\t{{.StarCount}}\t{{.IsOfficial}}"
starsHeader = "STARS"
officialHeader = "OFFICIAL"
automatedHeader = "AUTOMATED"
)
// NewSearchFormat returns a Format for rendering using a search Context
//
// Deprecated: this function was only used internally and will be removed in the next release.
func NewSearchFormat(source string) formatter.Format {
return newFormat(source)
}
// newFormat returns a Format for rendering using a searchContext.
func newFormat(source string) formatter.Format {
switch source {
case "", formatter.TableFormatKey:
return defaultSearchTableFormat
}
return formatter.Format(source)
}
// SearchWrite writes the context
//
// Deprecated: this function was only used internally and will be removed in the next release.
func SearchWrite(fmtCtx formatter.Context, results []registrytypes.SearchResult) error {
return formatWrite(fmtCtx, results)
}
// formatWrite writes the context.
func formatWrite(fmtCtx formatter.Context, results []registrytypes.SearchResult) error {
render := 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 {
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 {
formatter.HeaderContext
trunc bool
json bool
s registrytypes.SearchResult
}
func (c *searchContext) MarshalJSON() ([]byte, error) {
c.json = true
return formatter.MarshalJSON(c)
}
func (c *searchContext) Name() string {
return c.s.Name
}
func (c *searchContext) Description() string {
desc := strings.ReplaceAll(c.s.Description, "\n", " ")
desc = strings.ReplaceAll(desc, "\r", " ")
if c.trunc {
desc = formatter.Ellipsis(desc, 45)
}
return desc
}
func (c *searchContext) StarCount() string {
return strconv.Itoa(c.s.StarCount)
}
func (c *searchContext) formatBool(value bool) string {
switch {
case value && c.json:
return "true"
case value:
return "[OK]"
case c.json:
return "false"
default:
return ""
}
}
func (c *searchContext) IsOfficial() string {
return c.formatBool(c.s.IsOfficial)
}