github.com/xeptore/docker-cli@v20.10.14+incompatible/cli/command/formatter/volume.go (about) 1 package formatter 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/docker/docker/api/types" 8 units "github.com/docker/go-units" 9 ) 10 11 const ( 12 defaultVolumeQuietFormat = "{{.Name}}" 13 defaultVolumeTableFormat = "table {{.Driver}}\t{{.Name}}" 14 15 volumeNameHeader = "VOLUME NAME" 16 mountpointHeader = "MOUNTPOINT" 17 linksHeader = "LINKS" 18 // Status header ? 19 ) 20 21 // NewVolumeFormat returns a format for use with a volume Context 22 func NewVolumeFormat(source string, quiet bool) Format { 23 switch source { 24 case TableFormatKey: 25 if quiet { 26 return defaultVolumeQuietFormat 27 } 28 return defaultVolumeTableFormat 29 case RawFormatKey: 30 if quiet { 31 return `name: {{.Name}}` 32 } 33 return `name: {{.Name}}\ndriver: {{.Driver}}\n` 34 } 35 return Format(source) 36 } 37 38 // VolumeWrite writes formatted volumes using the Context 39 func VolumeWrite(ctx Context, volumes []*types.Volume) error { 40 render := func(format func(subContext SubContext) error) error { 41 for _, volume := range volumes { 42 if err := format(&volumeContext{v: *volume}); err != nil { 43 return err 44 } 45 } 46 return nil 47 } 48 return ctx.Write(newVolumeContext(), render) 49 } 50 51 type volumeContext struct { 52 HeaderContext 53 v types.Volume 54 } 55 56 func newVolumeContext() *volumeContext { 57 volumeCtx := volumeContext{} 58 volumeCtx.Header = SubHeaderContext{ 59 "Name": volumeNameHeader, 60 "Driver": DriverHeader, 61 "Scope": ScopeHeader, 62 "Mountpoint": mountpointHeader, 63 "Labels": LabelsHeader, 64 "Links": linksHeader, 65 "Size": SizeHeader, 66 } 67 return &volumeCtx 68 } 69 70 func (c *volumeContext) MarshalJSON() ([]byte, error) { 71 return MarshalJSON(c) 72 } 73 74 func (c *volumeContext) Name() string { 75 return c.v.Name 76 } 77 78 func (c *volumeContext) Driver() string { 79 return c.v.Driver 80 } 81 82 func (c *volumeContext) Scope() string { 83 return c.v.Scope 84 } 85 86 func (c *volumeContext) Mountpoint() string { 87 return c.v.Mountpoint 88 } 89 90 func (c *volumeContext) Labels() string { 91 if c.v.Labels == nil { 92 return "" 93 } 94 95 var joinLabels []string 96 for k, v := range c.v.Labels { 97 joinLabels = append(joinLabels, fmt.Sprintf("%s=%s", k, v)) 98 } 99 return strings.Join(joinLabels, ",") 100 } 101 102 func (c *volumeContext) Label(name string) string { 103 if c.v.Labels == nil { 104 return "" 105 } 106 return c.v.Labels[name] 107 } 108 109 func (c *volumeContext) Links() string { 110 if c.v.UsageData == nil { 111 return "N/A" 112 } 113 return fmt.Sprintf("%d", c.v.UsageData.RefCount) 114 } 115 116 func (c *volumeContext) Size() string { 117 if c.v.UsageData == nil { 118 return "N/A" 119 } 120 return units.HumanSize(float64(c.v.UsageData.Size)) 121 }