github.com/beauknowssoftware/makehcl@v0.0.0-20200322000747-1b9bb1e1c008/internal/cmd/plan.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  
     7  	"github.com/beauknowssoftware/makehcl/internal/plan"
     8  	"github.com/jessevdk/go-flags"
     9  	"github.com/olekukonko/tablewriter"
    10  )
    11  
    12  type PlanCommand struct {
    13  	Filename flags.Filename `short:"f" long:"filename"`
    14  	All      bool           `short:"a" long:"all"`
    15  	Reason   bool           `short:"r" long:"reason"`
    16  	Goal     Goal           `positional-args:"yes"`
    17  }
    18  
    19  func reasonDescription(r plan.Reason) string {
    20  	switch r.ReasonType {
    21  	case plan.DoesNotExist:
    22  		return fmt.Sprintf("%v does not exist", r.Target)
    23  	case plan.DependencyPlanned:
    24  		return fmt.Sprintf("dependency %v is planned", r.Target)
    25  	case plan.OlderThanDependency:
    26  		return fmt.Sprintf("dependency %v has changed", r.Target)
    27  	default:
    28  		return fmt.Sprintf("unknown (%v)", r.Target)
    29  	}
    30  }
    31  
    32  func (c *PlanCommand) Execute(_ []string) error {
    33  	var o plan.DoOptions
    34  	o.Filename = string(c.Filename)
    35  	o.IgnoreLastModified = c.All
    36  	o.Goal = c.Goal.strings()
    37  
    38  	p, err := plan.Do(o)
    39  	if err != nil {
    40  		return err
    41  	}
    42  
    43  	if c.Reason && !c.All && len(p) > 0 {
    44  		printReasonTable(p)
    45  	} else {
    46  		for _, e := range p {
    47  			fmt.Println(e.Target)
    48  		}
    49  	}
    50  
    51  	return nil
    52  }
    53  
    54  func printReasonTable(p plan.Plan) {
    55  	table := tablewriter.NewWriter(os.Stdout)
    56  	table.SetHeader([]string{"Target", "Reason"})
    57  	/*
    58  		table.SetAutoWrapText(false)
    59  		table.SetAutoFormatHeaders(true)
    60  		table.SetHeaderAlignment(tablewriter.ALIGN_LEFT)
    61  		table.SetAlignment(tablewriter.ALIGN_LEFT)
    62  		table.SetCenterSeparator("")
    63  		table.SetColumnSeparator("")
    64  		table.SetRowSeparator("")
    65  		table.SetHeaderLine(false)
    66  		table.SetBorder(false)
    67  		table.SetTablePadding("\t") // pad with tabs
    68  		table.SetNoWhiteSpace(true)
    69  	*/
    70  	table.SetRowLine(true)
    71  
    72  	for _, e := range p {
    73  		for _, r := range e.Reasons {
    74  			table.Append([]string{e.Target, reasonDescription(r)})
    75  		}
    76  	}
    77  
    78  	table.Render()
    79  }