From 56dd921444d538cde19b59693a038189e9c79d86 Mon Sep 17 00:00:00 2001 From: ktr0731 Date: Mon, 8 Jan 2018 18:48:45 +0900 Subject: [PATCH] add colored ui --- adapter/controller/cli.go | 4 ++++ adapter/logger/logger.go | 23 +++++++++++++++++++++++ config/config.go | 5 +++++ repl/repl.go | 24 ++++++++++++++++++++++++ usecase/interactor.go | 4 +++- usecase/package.go | 7 +++++-- usecase/port/logger.go | 6 ++++++ usecase/service_test.go | 33 +++++++++++++++++++++++++++++++++ 8 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 adapter/logger/logger.go create mode 100644 usecase/port/logger.go create mode 100644 usecase/service_test.go diff --git a/adapter/controller/cli.go b/adapter/controller/cli.go index 0226b1d5..fbb42606 100644 --- a/adapter/controller/cli.go +++ b/adapter/controller/cli.go @@ -8,6 +8,7 @@ import ( arg "github.com/alexflint/go-arg" multierror "github.com/hashicorp/go-multierror" "github.com/ktr0731/evans/adapter/gateway" + "github.com/ktr0731/evans/adapter/logger" "github.com/ktr0731/evans/adapter/presenter" "github.com/ktr0731/evans/config" "github.com/ktr0731/evans/entity" @@ -86,6 +87,7 @@ func (c *CLI) Usage() { func (c *CLI) Run(args []string) int { params := &usecase.InteractorParams{ OutputPort: presenter.NewJSONCLIPresenter(), + Logger: logger.NewStdLogger(config.Get()), } c.parser = arg.MustParse(c.options) @@ -134,6 +136,8 @@ func (c *CLI) Run(args []string) int { } } else { params.InputterPort = gateway.NewPromptInputter(env) + params.Logger = logger.NewPromptLogger() + interactor := usecase.NewInteractor(params) r := repl.NewREPL(c.config.REPL, env, repl.NewBasicUI(), interactor) defer r.Close() diff --git a/adapter/logger/logger.go b/adapter/logger/logger.go new file mode 100644 index 00000000..c5b849ba --- /dev/null +++ b/adapter/logger/logger.go @@ -0,0 +1,23 @@ +package logger + +import ( + "io" + "io/ioutil" + "log" + "os" + + "github.com/ktr0731/evans/config" + "github.com/ktr0731/evans/usecase/port" +) + +func NewStdLogger(config *config.Config) port.Logger { + return log.New(os.Stdout, config.Log.Prefix, log.LstdFlags) +} + +func NewPromptLogger(ui io.Writer, config *config.Config) port.Logger { + return log.New(ui, config.Log.Prefix, log.LstdFlags) +} + +func NewNopLogger() port.Logger { + return log.New(ioutil.Discard, "", log.LstdFlags) +} diff --git a/config/config.go b/config/config.go index c913a393..e17b9a9a 100644 --- a/config/config.go +++ b/config/config.go @@ -61,6 +61,7 @@ type Config struct { REPL *REPL `toml:"repl"` Env *Env `toml:"env"` Server *Server `toml:"server"` + Log *Log `toml:"log"` } type Default struct { @@ -68,6 +69,10 @@ type Default struct { Service string `toml:"service"` } +type Log struct { + Prefix string `default:"[evans] " toml:"prefix"` +} + type localConfig struct { Default *Default `toml:"default"` } diff --git a/repl/repl.go b/repl/repl.go index ecb89ad3..a652191c 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -46,6 +46,30 @@ type UI struct { prompt string } +func (u *UI) Println(s string) { + fmt.Fprintln(u.Writer, s) +} + +func (u *UI) InfoPrintln(s string) { + fmt.Fprintln(u.Writer, s) +} + +func (u *UI) ErrPrintln(s string) { + fmt.Fprintln(u.ErrWriter, s) +} + +type ColoredUI struct { + UI +} + +func (u *ColoredUI) InfoPrintln(s string) { + u.Println(color.BlueString(s)) +} + +func (u *ColoredUI) ErrPrintln(s string) { + u.ErrPrintln(color.RedString(s)) +} + func NewBasicUI() *UI { return &UI{ Reader: os.Stdin, diff --git a/usecase/interactor.go b/usecase/interactor.go index a5d4e293..fdf4efd9 100644 --- a/usecase/interactor.go +++ b/usecase/interactor.go @@ -11,6 +11,7 @@ type Interactor struct { env *entity.Env outputPort port.OutputPort + logger port.Logger inputterPort port.Inputter grpcPort port.GRPCPort dynamicBuilder port.DynamicBuilder @@ -19,6 +20,7 @@ type Interactor struct { type InteractorParams struct { OutputPort port.OutputPort InputterPort port.Inputter + Logger port.Logger } func NewInteractor(params *InteractorParams) *Interactor { @@ -29,7 +31,7 @@ func NewInteractor(params *InteractorParams) *Interactor { } func (i *Interactor) Package(params *port.PackageParams) (*port.PackageResponse, error) { - return Package(params, i.outputPort, i.env) + return Package(params, i.outputPort, i.logger, i.env) } func (i *Interactor) Service(params *port.ServiceParams) (*port.ServiceResponse, error) { diff --git a/usecase/package.go b/usecase/package.go index 2a4d18ec..3305beef 100644 --- a/usecase/package.go +++ b/usecase/package.go @@ -5,9 +5,12 @@ import ( "github.com/ktr0731/evans/usecase/port" ) -func Package(params *port.PackageParams, outputPort port.OutputPort, env entity.Environment) (*port.PackageResponse, error) { +func Package(params *port.PackageParams, outputPort port.OutputPort, logger port.Logger, env entity.Environment) (*port.PackageResponse, error) { if err := env.UsePackage(params.PkgName); err != nil { - return nil, err + switch err { + case entity.ErrUnknownPackage: + logger.Printf("unknown package: %s") + } } return outputPort.Package() } diff --git a/usecase/port/logger.go b/usecase/port/logger.go new file mode 100644 index 00000000..c0c956ac --- /dev/null +++ b/usecase/port/logger.go @@ -0,0 +1,6 @@ +package port + +type Logger interface { + Printf(format string, v ...interface{}) + Println(v ...interface{}) +} diff --git a/usecase/service_test.go b/usecase/service_test.go new file mode 100644 index 00000000..61b295ba --- /dev/null +++ b/usecase/service_test.go @@ -0,0 +1,33 @@ +package usecase + +import ( + "testing" + + "github.com/ktr0731/evans/adapter/presenter" + "github.com/ktr0731/evans/entity" + "github.com/ktr0731/evans/usecase/port" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type serviceEnv struct { + entity.Environment + + usedService string +} + +func (e *serviceEnv) UseService(pkgName string) error { + e.usedService = pkgName + return nil +} + +func TestService(t *testing.T) { + expected := "example_service" + params := &port.ServiceParams{expected} + presenter := &presenter.StubPresenter{} + env := &serviceEnv{} + + _, err := Service(params, presenter, env) + require.NoError(t, err) + assert.Equal(t, expected, env.usedService) +}