github.com/olljanat/moby@v1.13.1/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(&volumeContext{}, render)
    49  }
    50  
    51  type volumeContext struct {
    52  	HeaderContext
    53  	v types.Volume
    54  }
    55  
    56  func (c *volumeContext) MarshalJSON() ([]byte, error) {
    57  	return marshalJSON(c)
    58  }
    59  
    60  func (c *volumeContext) Name() string {
    61  	c.AddHeader(volumeNameHeader)
    62  	return c.v.Name
    63  }
    64  
    65  func (c *volumeContext) Driver() string {
    66  	c.AddHeader(driverHeader)
    67  	return c.v.Driver
    68  }
    69  
    70  func (c *volumeContext) Scope() string {
    71  	c.AddHeader(scopeHeader)
    72  	return c.v.Scope
    73  }
    74  
    75  func (c *volumeContext) Mountpoint() string {
    76  	c.AddHeader(mountpointHeader)
    77  	return c.v.Mountpoint
    78  }
    79  
    80  func (c *volumeContext) Labels() string {
    81  	c.AddHeader(labelsHeader)
    82  	if c.v.Labels == nil {
    83  		return ""
    84  	}
    85  
    86  	var joinLabels []string
    87  	for k, v := range c.v.Labels {
    88  		joinLabels = append(joinLabels, fmt.Sprintf("%s=%s", k, v))
    89  	}
    90  	return strings.Join(joinLabels, ",")
    91  }
    92  
    93  func (c *volumeContext) Label(name string) string {
    94  
    95  	n := strings.Split(name, ".")
    96  	r := strings.NewReplacer("-", " ", "_", " ")
    97  	h := r.Replace(n[len(n)-1])
    98  
    99  	c.AddHeader(h)
   100  
   101  	if c.v.Labels == nil {
   102  		return ""
   103  	}
   104  	return c.v.Labels[name]
   105  }
   106  
   107  func (c *volumeContext) Links() string {
   108  	c.AddHeader(linksHeader)
   109  	if c.v.UsageData == nil {
   110  		return "N/A"
   111  	}
   112  	return fmt.Sprintf("%d", c.v.UsageData.RefCount)
   113  }
   114  
   115  func (c *volumeContext) Size() string {
   116  	c.AddHeader(sizeHeader)
   117  	if c.v.UsageData == nil {
   118  		return "N/A"
   119  	}
   120  	return units.HumanSize(float64(c.v.UsageData.Size))
   121  }