diff --git a/command/cli_ui.go b/command/cli_ui.go new file mode 100644 index 000000000..b9fc23556 --- /dev/null +++ b/command/cli_ui.go @@ -0,0 +1,42 @@ +package command + +import ( + "fmt" + + "github.com/mitchellh/cli" + "github.com/mitchellh/colorstring" +) + +// ColoredUi is a Ui implementation that colors its output according +// to the given color schemes for the given type of output. +type ColorizeUi struct { + Colorize *colorstring.Colorize + OutputColor string + InfoColor string + ErrorColor string + Ui cli.Ui +} + +func (u *ColorizeUi) Ask(query string) (string, error) { + return u.Ui.Ask(u.colorize(query, u.OutputColor)) +} + +func (u *ColorizeUi) Output(message string) { + u.Ui.Output(u.colorize(message, u.OutputColor)) +} + +func (u *ColorizeUi) Info(message string) { + u.Ui.Info(u.colorize(message, u.InfoColor)) +} + +func (u *ColorizeUi) Error(message string) { + u.Ui.Error(u.colorize(message, u.ErrorColor)) +} + +func (u *ColorizeUi) colorize(message string, color string) string { + if color == "" { + return message + } + + return u.Colorize.Color(fmt.Sprintf("%s%s[reset]", color, message)) +} diff --git a/command/cli_ui_test.go b/command/cli_ui_test.go new file mode 100644 index 000000000..ac2b7d7ea --- /dev/null +++ b/command/cli_ui_test.go @@ -0,0 +1,11 @@ +package command + +import ( + "testing" + + "github.com/mitchellh/cli" +) + +func TestColorizeUi_impl(t *testing.T) { + var _ cli.Ui = new(ColorizeUi) +} diff --git a/command/meta.go b/command/meta.go index a7758a444..3bafdb7a8 100644 --- a/command/meta.go +++ b/command/meta.go @@ -15,6 +15,8 @@ type Meta struct { Color bool ContextOpts *terraform.ContextOpts Ui cli.Ui + + oldUi cli.Ui } // Colorize returns the colorization structure for a command. @@ -104,15 +106,30 @@ func (m *Meta) contextOpts() *terraform.ContextOpts { // will potentially modify the args in-place. It will return the resulting // slice. func (m *Meta) process(args []string) []string { - m.Color = true + // We do this so that we retain the ability to technically call + // process multiple times, even if we have no plans to do so + if m.oldUi != nil { + m.Ui = m.oldUi + } + // Set colorization + m.Color = true for i, v := range args { if v == "-no-color" { m.Color = false - return append(args[:i], args[i+1:]...) + args = append(args[:i], args[i+1:]...) + break } } + // Set the UI + m.oldUi = m.Ui + m.Ui = &ColorizeUi{ + Colorize: m.Colorize(), + ErrorColor: "[red]", + Ui: m.oldUi, + } + return args }