github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/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  	mountpointHeader = "MOUNTPOINT"
    16  	linksHeader      = "LINKS"
    17  	// Status header ?
    18  )
    19  
    20  // NewVolumeFormat returns a format for use with a volume Context
    21  func NewVolumeFormat(source string, quiet bool) Format {
    22  	switch source {
    23  	case TableFormatKey:
    24  		if quiet {
    25  			return defaultVolumeQuietFormat
    26  		}
    27  		return defaultVolumeTableFormat
    28  	case RawFormatKey:
    29  		if quiet {
    30  			return `name: {{.Name}}`
    31  		}
    32  		return `name: {{.Name}}\ndriver: {{.Driver}}\n`
    33  	}
    34  	return Format(source)
    35  }
    36  
    37  // VolumeWrite writes formatted volumes using the Context
    38  func VolumeWrite(ctx Context, volumes []*types.Volume) error {
    39  	render := func(format func(subContext subContext) error) error {
    40  		for _, volume := range volumes {
    41  			if err := format(&volumeContext{v: *volume}); err != nil {
    42  				return err
    43  			}
    44  		}
    45  		return nil
    46  	}
    47  	return ctx.Write(&volumeContext{}, render)
    48  }
    49  
    50  type volumeContext struct {
    51  	HeaderContext
    52  	v types.Volume
    53  }
    54  
    55  func (c *volumeContext) Name() string {
    56  	c.AddHeader(nameHeader)
    57  	return c.v.Name
    58  }
    59  
    60  func (c *volumeContext) Driver() string {
    61  	c.AddHeader(driverHeader)
    62  	return c.v.Driver
    63  }
    64  
    65  func (c *volumeContext) Scope() string {
    66  	c.AddHeader(scopeHeader)
    67  	return c.v.Scope
    68  }
    69  
    70  func (c *volumeContext) Mountpoint() string {
    71  	c.AddHeader(mountpointHeader)
    72  	return c.v.Mountpoint
    73  }
    74  
    75  func (c *volumeContext) Labels() string {
    76  	c.AddHeader(labelsHeader)
    77  	if c.v.Labels == nil {
    78  		return ""
    79  	}
    80  
    81  	var joinLabels []string
    82  	for k, v := range c.v.Labels {
    83  		joinLabels = append(joinLabels, fmt.Sprintf("%s=%s", k, v))
    84  	}
    85  	return strings.Join(joinLabels, ",")
    86  }
    87  
    88  func (c *volumeContext) Label(name string) string {
    89  
    90  	n := strings.Split(name, ".")
    91  	r := strings.NewReplacer("-", " ", "_", " ")
    92  	h := r.Replace(n[len(n)-1])
    93  
    94  	c.AddHeader(h)
    95  
    96  	if c.v.Labels == nil {
    97  		return ""
    98  	}
    99  	return c.v.Labels[name]
   100  }
   101  
   102  func (c *volumeContext) Links() string {
   103  	c.AddHeader(linksHeader)
   104  	if c.v.Size == -1 {
   105  		return "N/A"
   106  	}
   107  	return fmt.Sprintf("%d", c.v.RefCount)
   108  }
   109  
   110  func (c *volumeContext) Size() string {
   111  	c.AddHeader(sizeHeader)
   112  	if c.v.Size == -1 {
   113  		return "N/A"
   114  	}
   115  	return units.HumanSize(float64(c.v.Size))
   116  }