github.com/justincormack/cli@v0.0.0-20201215022714-831ebeae9675/cli/command/container/formatter_diff.go (about)

     1  package container
     2  
     3  import (
     4  	"github.com/docker/cli/cli/command/formatter"
     5  	"github.com/docker/docker/api/types/container"
     6  	"github.com/docker/docker/pkg/archive"
     7  )
     8  
     9  const (
    10  	defaultDiffTableFormat = "table {{.Type}}\t{{.Path}}"
    11  
    12  	changeTypeHeader = "CHANGE TYPE"
    13  	pathHeader       = "PATH"
    14  )
    15  
    16  // NewDiffFormat returns a format for use with a diff Context
    17  func NewDiffFormat(source string) formatter.Format {
    18  	switch source {
    19  	case formatter.TableFormatKey:
    20  		return defaultDiffTableFormat
    21  	}
    22  	return formatter.Format(source)
    23  }
    24  
    25  // DiffFormatWrite writes formatted diff using the Context
    26  func DiffFormatWrite(ctx formatter.Context, changes []container.ContainerChangeResponseItem) error {
    27  
    28  	render := func(format func(subContext formatter.SubContext) error) error {
    29  		for _, change := range changes {
    30  			if err := format(&diffContext{c: change}); err != nil {
    31  				return err
    32  			}
    33  		}
    34  		return nil
    35  	}
    36  	return ctx.Write(newDiffContext(), render)
    37  }
    38  
    39  type diffContext struct {
    40  	formatter.HeaderContext
    41  	c container.ContainerChangeResponseItem
    42  }
    43  
    44  func newDiffContext() *diffContext {
    45  	diffCtx := diffContext{}
    46  	diffCtx.Header = formatter.SubHeaderContext{
    47  		"Type": changeTypeHeader,
    48  		"Path": pathHeader,
    49  	}
    50  	return &diffCtx
    51  }
    52  
    53  func (d *diffContext) MarshalJSON() ([]byte, error) {
    54  	return formatter.MarshalJSON(d)
    55  }
    56  
    57  func (d *diffContext) Type() string {
    58  	var kind string
    59  	switch d.c.Kind {
    60  	case archive.ChangeModify:
    61  		kind = "C"
    62  	case archive.ChangeAdd:
    63  		kind = "A"
    64  	case archive.ChangeDelete:
    65  		kind = "D"
    66  	}
    67  	return kind
    68  
    69  }
    70  
    71  func (d *diffContext) Path() string {
    72  	return d.c.Path
    73  }