From e06e09a6d396031c89b87383eef3cad6f647cf2c Mon Sep 17 00:00:00 2001 From: Craig Pastro Date: Fri, 3 Jun 2022 10:34:29 -0700 Subject: [PATCH] Add Must(*Logger, error) *Logger function (#1105) --- example_test.go | 10 ++-------- logger.go | 13 +++++++++++++ logger_test.go | 10 ++++++++++ 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/example_test.go b/example_test.go index aecf41246..327e3ef39 100644 --- a/example_test.go +++ b/example_test.go @@ -91,10 +91,7 @@ func Example_basicConfiguration() { if err := json.Unmarshal(rawJSON, &cfg); err != nil { panic(err) } - logger, err := cfg.Build() - if err != nil { - panic(err) - } + logger := zap.Must(cfg.Build()) defer logger.Sync() logger.Info("logger construction succeeded") @@ -278,10 +275,7 @@ func ExampleAtomicLevel_config() { if err := json.Unmarshal(rawJSON, &cfg); err != nil { panic(err) } - logger, err := cfg.Build() - if err != nil { - panic(err) - } + logger := zap.Must(cfg.Build()) defer logger.Sync() logger.Info("info logging enabled") diff --git a/logger.go b/logger.go index febc3d827..c84145d66 100644 --- a/logger.go +++ b/logger.go @@ -107,6 +107,19 @@ func NewDevelopment(options ...Option) (*Logger, error) { return NewDevelopmentConfig().Build(options...) } +// Must is a helper that wraps a call to a function returning (*Logger, error) +// and panics if the error is non-nil. It is intended for use in variable +// initialization such as: +// +// var logger := zap.Must(zap.NewProduction()) +func Must(logger *Logger, err error) *Logger { + if err != nil { + panic(err) + } + + return logger +} + // NewExample builds a Logger that's designed for use in zap's testable // examples. It writes DebugLevel and above logs to standard out as JSON, but // omits the timestamp and calling function to keep example output diff --git a/logger_test.go b/logger_test.go index c71306c7d..58b756a56 100644 --- a/logger_test.go +++ b/logger_test.go @@ -628,6 +628,16 @@ func TestNopLogger(t *testing.T) { }) } +func TestMust(t *testing.T) { + t.Run("must without an error does not panic", func(t *testing.T) { + assert.NotPanics(t, func() { Must(NewNop(), nil) }, "must paniced with no error") + }) + + t.Run("must with an error panics", func(t *testing.T) { + assert.Panics(t, func() { Must(nil, errors.New("an error")) }, "must did not panic with an error") + }) +} + func infoLog(logger *Logger, msg string, fields ...Field) { logger.Info(msg, fields...) }