diff --git a/packer/ui.go b/packer/ui.go index 401c94cd8..6bc7af987 100644 --- a/packer/ui.go +++ b/packer/ui.go @@ -14,6 +14,13 @@ type Ui interface { Error(format string, a ...interface{}) } +// PrefixedUi is a UI that wraps another UI implementation and adds a +// prefix to all the messages going out. +type PrefixedUi struct { + Prefix string + Ui Ui +} + // The ReaderWriterUi is a UI that writes and reads from standard Go // io.Reader and io.Writer. type ReaderWriterUi struct { @@ -21,6 +28,14 @@ type ReaderWriterUi struct { Writer io.Writer } +func (u *PrefixedUi) Say(format string, a ...interface{}) { + u.Ui.Say(fmt.Sprintf("%s: %s", u.Prefix, format), a...) +} + +func (u *PrefixedUi) Error(format string, a ...interface{}) { + u.Ui.Error(fmt.Sprintf("%s: %s", u.Prefix, format), a...) +} + func (rw *ReaderWriterUi) Say(format string, a ...interface{}) { output := fmt.Sprintf(format, a...) log.Printf("ui: %s", output) diff --git a/packer/ui_test.go b/packer/ui_test.go index 69261af49..7faaf9795 100644 --- a/packer/ui_test.go +++ b/packer/ui_test.go @@ -13,6 +13,35 @@ func testUi() *ReaderWriterUi { } } +func TestPrefixedUi(t *testing.T) { + assert := asserts.NewTestingAsserts(t, true) + + bufferUi := testUi() + prefixUi := &PrefixedUi{"mitchell", bufferUi} + + prefixUi.Say("foo") + assert.Equal(readWriter(bufferUi), "mitchell: foo\n", "should have prefix") + + prefixUi.Error("bar") + assert.Equal(readWriter(bufferUi), "mitchell: bar\n", "should have prefix") +} + +func TestPrefixedUi_ImplUi(t *testing.T) { + var raw interface{} + raw = &PrefixedUi{} + if _, ok := raw.(Ui); !ok { + t.Fatalf("PrefixedUi must implement Ui") + } +} + +func TestReaderWriterUi_ImplUi(t *testing.T) { + var raw interface{} + raw = &ReaderWriterUi{} + if _, ok := raw.(Ui); !ok { + t.Fatalf("ReaderWriterUi must implement Ui") + } +} + func TestReaderWriterUi_Error(t *testing.T) { assert := asserts.NewTestingAsserts(t, true)