Add efficient implementation of fmt and use for errors.

This commit is contained in:
Jae Kwon 2018-03-17 15:23:03 +01:00
parent bb875303c2
commit 99437a96fb
2 changed files with 20 additions and 8 deletions

View File

@ -10,16 +10,19 @@ import (
type Error interface { type Error interface {
Error() string Error() string
Trace(msg string) Error Trace(format string, a ...interface{}) Error
TraceCause(cause error, msg string) Error TraceCause(cause error, format string, a ...interface{}) Error
Cause() error Cause() error
} }
func NewError(msg string) Error { func NewError(format string, a ...interface{}) Error {
msg := Fmt(format, a...)
return newError(msg, nil) return newError(msg, nil)
} }
func NewErrorWithCause(cause error, msg string) Error { func NewErrorWithCause(cause error, format string, a ...interface{}) Error {
msg := Fmt(format, a...)
return newError(msg, cause) return newError(msg, cause)
} }
@ -39,6 +42,7 @@ type cmnError struct {
traces []traceItem traces []traceItem
} }
// NOTE: Do not expose, it's not very friendly.
func newError(msg string, cause error) *cmnError { func newError(msg string, cause error) *cmnError {
return &cmnError{ return &cmnError{
msg: msg, msg: msg,
@ -52,13 +56,15 @@ func (err *cmnError) Error() string {
} }
// Add tracing information with msg. // Add tracing information with msg.
func (err *cmnError) Trace(msg string) Error { func (err *cmnError) Trace(format string, a ...interface{}) Error {
msg := Fmt(format, a...)
return err.doTrace(msg, 2) return err.doTrace(msg, 2)
} }
// Add tracing information with cause and msg. // Add tracing information with cause and msg.
// If a cause was already set before, it is overwritten. // If a cause was already set before, it is overwritten.
func (err *cmnError) TraceCause(cause error, msg string) Error { func (err *cmnError) TraceCause(cause error, format string, a ...interface{}) Error {
msg := Fmt(format, a...)
err.cause = cause err.cause = cause
return err.doTrace(msg, 2) return err.doTrace(msg, 2)
} }

View File

@ -6,8 +6,14 @@ import (
"strings" "strings"
) )
// Fmt shorthand, XXX DEPRECATED // Like fmt.Sprintf, but skips formatting if args are empty.
var Fmt = fmt.Sprintf var Fmt = func(format string, a ...interface{}) string {
if len(a) == 0 {
return format
} else {
return fmt.Sprintf(format, a...)
}
}
// RightPadString adds spaces to the right of a string to make it length totalLength // RightPadString adds spaces to the right of a string to make it length totalLength
func RightPadString(s string, totalLength int) string { func RightPadString(s string, totalLength int) string {