diff options
author | zelig <viktor.tron@gmail.com> | 2015-02-25 20:21:59 +0800 |
---|---|---|
committer | zelig <viktor.tron@gmail.com> | 2015-02-25 20:21:59 +0800 |
commit | d46c7bcaf9268a191f0156d36abf394df5374795 (patch) | |
tree | afc4ee70d7648496186c58eea3d294266ba12608 /errs/errors.go | |
parent | 52ccaa605e2a693bda64ac7d9fadf88d669ac446 (diff) | |
download | dexon-d46c7bcaf9268a191f0156d36abf394df5374795.tar dexon-d46c7bcaf9268a191f0156d36abf394df5374795.tar.gz dexon-d46c7bcaf9268a191f0156d36abf394df5374795.tar.bz2 dexon-d46c7bcaf9268a191f0156d36abf394df5374795.tar.lz dexon-d46c7bcaf9268a191f0156d36abf394df5374795.tar.xz dexon-d46c7bcaf9268a191f0156d36abf394df5374795.tar.zst dexon-d46c7bcaf9268a191f0156d36abf394df5374795.zip |
errs pkg for error code based errors
Diffstat (limited to 'errs/errors.go')
-rw-r--r-- | errs/errors.go | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/errs/errors.go b/errs/errors.go new file mode 100644 index 000000000..f1b0ebdbb --- /dev/null +++ b/errs/errors.go @@ -0,0 +1,91 @@ +package errs + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/logger" +) + +/* +Errors implements an error handler providing standardised errors for a package. +Fields: + + Errors: + a map from error codes to description + + Package: + name of the package/component + + Level: + a function mapping error code to logger.LogLevel (severity) + if not given, errors default to logger.InfoLevel +*/ +type Errors struct { + Errors map[int]string + Package string + Level func(code int) logger.LogLevel +} + +/* +Error implements the standard go error interface. + + errors.New(code, format, params ...interface{}) + +Prints as: + + [package] description: details + +where details is fmt.Sprintf(self.format, self.params...) +*/ +type Error struct { + Code int + Name string + Package string + level logger.LogLevel + message string + format string + params []interface{} +} + +func (self *Errors) New(code int, format string, params ...interface{}) *Error { + name, ok := self.Errors[code] + if !ok { + panic("invalid error code") + } + level := logger.InfoLevel + if self.Level != nil { + level = self.Level(code) + } + return &Error{ + Code: code, + Name: name, + Package: self.Package, + level: level, + format: format, + params: params, + } +} + +func (self Error) Error() (message string) { + if len(message) == 0 { + self.message = fmt.Sprintf("[%s] %s", self.Package, self.Name) + if self.format != "" { + self.message += ": " + fmt.Sprintf(self.format, self.params...) + } + } + return self.message +} + +func (self Error) Log(log *logger.Logger) { + log.Sendln(self.level, self) +} + +/* +err.Fatal() is true if err's severity level is 0 or 1 (logger.ErrorLevel or logger.Silence) +*/ +func (self *Error) Fatal() (fatal bool) { + if self.level < logger.WarnLevel { + fatal = true + } + return +} |