|
|
|
|
@ -25,13 +25,15 @@ package errs
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"fmt"
|
|
|
|
|
"reflect"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type (
|
|
|
|
|
|
|
|
|
|
formatTextState struct {
|
|
|
|
|
options *FormatTextOps
|
|
|
|
|
options FormatTextOps
|
|
|
|
|
buffer bytes.Buffer
|
|
|
|
|
level int
|
|
|
|
|
error error
|
|
|
|
|
@ -41,7 +43,7 @@ type (
|
|
|
|
|
|
|
|
|
|
func newFormatTextState (options *FormatTextOps) *formatTextState {
|
|
|
|
|
st := &formatTextState{
|
|
|
|
|
options : options,
|
|
|
|
|
options : *options,
|
|
|
|
|
}
|
|
|
|
|
return st
|
|
|
|
|
}
|
|
|
|
|
@ -54,7 +56,13 @@ func newFormatTextState (options *FormatTextOps) *formatTextState {
|
|
|
|
|
func (f *formatTextState) Options() FormatOps {
|
|
|
|
|
return f.options.FormatOps }
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) Reset () {}
|
|
|
|
|
func (f *formatTextState) Reset () {
|
|
|
|
|
f.buffer.Reset()
|
|
|
|
|
f.level = 0
|
|
|
|
|
f.error = nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) Level () int {
|
|
|
|
|
return f.level }
|
|
|
|
|
@ -66,24 +74,146 @@ func (f *formatTextState) Error () error {
|
|
|
|
|
func (f *formatTextState) Bytes () []byte {
|
|
|
|
|
return f.buffer.Bytes() }
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddError (err error, options ...FormatOpsFnc) {}
|
|
|
|
|
func (f *formatTextState) AddCause (err error, options ...FormatOpsFnc) {}
|
|
|
|
|
func (f *formatTextState) AddWrapped(err error, options ...FormatOpsFnc) {}
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddCode (code string, options ...FormatOpsFnc) {}
|
|
|
|
|
func (f *formatTextState) AddType (ter string , options ...FormatOpsFnc) {}
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddError (err error, options ...FormatOpsFnc) {
|
|
|
|
|
if err == nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddCause (err error, options ...FormatOpsFnc) {
|
|
|
|
|
if err == nil || !f.options.ShowCause() {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddTrace (trace StackTrace, options ...FormatOpsFnc) {
|
|
|
|
|
if trace == nil || !f.options.ShowTrace() {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddWrapped(err error, options ...FormatOpsFnc) {
|
|
|
|
|
if err == nil || !f.options.ShowWrapped() {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddCode (code string, options ...FormatOpsFnc) {
|
|
|
|
|
f.writeField("error",f.options.ValueAdapters.Apply(code),options...) }
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddType (ter string , options ...FormatOpsFnc) {
|
|
|
|
|
f.writeField("error-type",ter, options ...) }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddString (str string, options ...FormatOpsFnc) {
|
|
|
|
|
f.writeString(f.options.StringAdapters.Apply(str),options...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddStrings(str []string, options ...FormatOpsFnc) {
|
|
|
|
|
for _,s := range str {
|
|
|
|
|
f.writeString(f.options.StringAdapters.Apply(s))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddFieldString (name string, value string , options ...FormatOpsFnc) {
|
|
|
|
|
value = f.options.ValueAdapters.Apply(value)
|
|
|
|
|
if len(value) == 0 && !f.options.ShowFieldEmpty() {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
f.writeField(name,value) }
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddFieldInt (name string, value int , options ...FormatOpsFnc) {
|
|
|
|
|
f.writeField(name,fmt.Sprintf(f.options.IntLayout,value),options...) }
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddFieldFloat (name string, value float64 , options ...FormatOpsFnc) {
|
|
|
|
|
f.writeField(name,fmt.Sprintf(f.options.FloatLayout,value),options ...) }
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddFieldTime (name string, value time.Time, options ...FormatOpsFnc) {
|
|
|
|
|
f.writeField(name,value.Format(f.options.TimeLayout),options ...) }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) writeField (name string, value string, options ...FormatOpsFnc) {
|
|
|
|
|
name = f.options.NameAdapters.Apply (name)
|
|
|
|
|
if !f.options.ShowColors() {
|
|
|
|
|
f.writeString(name)
|
|
|
|
|
f.writeString(f.options.FieldSep)
|
|
|
|
|
f.writeString(value)
|
|
|
|
|
f.buffer.WriteString("\n")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) writeString(str string, options ...FormatOpsFnc) {
|
|
|
|
|
f.buffer.WriteString(str)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) format (er error) {
|
|
|
|
|
dn := false
|
|
|
|
|
defer func(d *bool, s *formatTextState){
|
|
|
|
|
if !(*d) {
|
|
|
|
|
if s.error == nil {
|
|
|
|
|
s.error = NewErrCause(G.ErrFormat,NewErrPanic(recover()))
|
|
|
|
|
} else {
|
|
|
|
|
s.error = NewErrCause(G.ErrFormat,s.error)
|
|
|
|
|
}
|
|
|
|
|
} else if s.level != 0 {
|
|
|
|
|
s.error = G.ErrFormatLevel
|
|
|
|
|
}
|
|
|
|
|
}(&dn,f)
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddTrace (trace StackTrace, options ...FormatOpsFnc) {}
|
|
|
|
|
if fm,is := er.(Formattable); is {
|
|
|
|
|
fm.BuildFormat(f)
|
|
|
|
|
} else {
|
|
|
|
|
f.build(er)
|
|
|
|
|
}
|
|
|
|
|
dn=true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) build (er error) {
|
|
|
|
|
rt := reflect.TypeOf(er)
|
|
|
|
|
if rt.Kind() == reflect.Pointer {
|
|
|
|
|
er = reflect.ValueOf(er).Elem().Interface().(error)
|
|
|
|
|
if er == nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
rt = rt.Elem()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
f.AddCode(er.Error())
|
|
|
|
|
f.AddType(rt.String())
|
|
|
|
|
|
|
|
|
|
if ms,is := er.(interface { Message() string }); is {
|
|
|
|
|
f.AddFieldString("message",ms.Message())
|
|
|
|
|
}
|
|
|
|
|
if in,is := er.(interface { Info () string }); is {
|
|
|
|
|
f.AddFieldString("info",in.Info())
|
|
|
|
|
}
|
|
|
|
|
if tm,is := er.(interface { Time() time.Time }); is {
|
|
|
|
|
f.AddFieldTime("time",tm.Time())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f.AddWrapped(Unwrap(er))
|
|
|
|
|
f.AddCause(UnwrapCause(er))
|
|
|
|
|
f.AddTrace(UnwrapTrace(er))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddString (str string, options ...FormatOpsFnc) {}
|
|
|
|
|
func (f *formatTextState) AddStringLn (str string, options ...FormatOpsFnc) {}
|
|
|
|
|
|
|
|
|
|
func (f *formatTextState) AddFieldString (name string, value string , options ...FormatOpsFnc) {}
|
|
|
|
|
func (f *formatTextState) AddFieldInt (name string, value int , options ...FormatOpsFnc) {}
|
|
|
|
|
func (f *formatTextState) AddFieldFloat (name string, value float64 , options ...FormatOpsFnc) {}
|
|
|
|
|
func (f *formatTextState) AddFieldDate (name string, value time.Time, options ...FormatOpsFnc) {}
|
|
|
|
|
func (f *formatTextState) AddFieldTime (name string, value time.Time, options ...FormatOpsFnc) {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|