package log
import (
"fmt"
"math"
"strconv"
"time"
)
type Kind uint8
const (
KindAny Kind = iota
KindString
KindInt64
KindUint64
KindFloat64
KindBool
KindDuration
KindTime
KindError
KindGroup
)
type Attr struct {
Key string
Value Value
}
type Value struct {
kind Kind
num uint64
s string
a any
}
func (v Value ) Kind () Kind { return v .kind }
func (v Value ) Int64 () int64 { return int64 (v .num ) }
func (v Value ) Uint64 () uint64 { return v .num }
func (v Value ) Float64 () float64 { return math .Float64frombits (v .num ) }
func (v Value ) Bool () bool { return v .num != 0 }
func (v Value ) Duration () time .Duration { return time .Duration (int64 (v .num )) }
func (v Value ) Time () time .Time {
t , _ := v .a .(time .Time )
return t
}
func (v Value ) Error () error {
e , _ := v .a .(error )
return e
}
func (v Value ) Group () []Attr {
g , _ := v .a .([]Attr )
return g
}
func (v Value ) Any () any {
switch v .kind {
case KindString :
return v .s
case KindInt64 :
return int64 (v .num )
case KindUint64 :
return v .num
case KindFloat64 :
return math .Float64frombits (v .num )
case KindBool :
return v .num != 0
case KindDuration :
return time .Duration (int64 (v .num ))
case KindTime :
return v .Time ()
case KindError :
return v .Error ()
case KindGroup :
return v .Group ()
default :
return v .a
}
}
func (v Value ) String () string {
switch v .kind {
case KindString :
return v .s
case KindInt64 :
return strconv .FormatInt (int64 (v .num ), 10 )
case KindUint64 :
return strconv .FormatUint (v .num , 10 )
case KindFloat64 :
return strconv .FormatFloat (math .Float64frombits (v .num ), 'g' , -1 , 64 )
case KindBool :
return strconv .FormatBool (v .num != 0 )
case KindDuration :
return time .Duration (int64 (v .num )).String ()
case KindTime :
return v .Time ().String ()
case KindError :
if e := v .Error (); e != nil {
return e .Error()
}
return "<nil>"
case KindGroup :
return fmt .Sprint (v .Group ())
default :
return fmt .Sprint (v .a )
}
}
func String (key , value string ) Attr {
return Attr {Key : key , Value : Value {kind : KindString , s : value }}
}
func Int (key string , value int ) Attr {
return Int64 (key , int64 (value ))
}
func Int64 (key string , value int64 ) Attr {
return Attr {Key : key , Value : Value {kind : KindInt64 , num : uint64 (value )}}
}
func Uint64 (key string , value uint64 ) Attr {
return Attr {Key : key , Value : Value {kind : KindUint64 , num : value }}
}
func Float64 (key string , value float64 ) Attr {
return Attr {Key : key , Value : Value {kind : KindFloat64 , num : math .Float64bits (value )}}
}
func Bool (key string , value bool ) Attr {
var n uint64
if value {
n = 1
}
return Attr {Key : key , Value : Value {kind : KindBool , num : n }}
}
func Duration (key string , value time .Duration ) Attr {
return Attr {Key : key , Value : Value {kind : KindDuration , num : uint64 (value )}}
}
func Time (key string , value time .Time ) Attr {
return Attr {Key : key , Value : Value {kind : KindTime , a : value }}
}
func Error (err error ) Attr {
return Attr {Key : "error" , Value : Value {kind : KindError , a : err }}
}
func Int32 (key string , value int32 ) Attr {
return Int64 (key , int64 (value ))
}
func NamedError (key string , err error ) Attr {
return Attr {Key : key , Value : Value {kind : KindError , a : err }}
}
func Stringer (key string , value fmt .Stringer ) Attr {
if value == nil {
return String (key , "<nil>" )
}
return String (key , value .String ())
}
func Group (key string , attrs ...Attr ) Attr {
return Attr {Key : key , Value : Value {kind : KindGroup , a : attrs }}
}
func Any (key string , value any ) Attr {
return Attr {Key : key , Value : Value {kind : KindAny , a : value }}
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .