diff options
Diffstat (limited to 'vendor/codeberg.org/gruf/go-kv/v2/format')
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/README.md | 32 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/abi.go | 25 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/args.go | 247 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/array.go | 235 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/cache.go | 60 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/format.go | 687 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/formatting.go | 161 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/map.go | 134 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/methods.go | 242 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/pointer.go | 130 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/slice.go | 160 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/struct.go | 175 | ||||
| -rw-r--r-- | vendor/codeberg.org/gruf/go-kv/v2/format/type.go | 109 |
13 files changed, 0 insertions, 2397 deletions
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/README.md b/vendor/codeberg.org/gruf/go-kv/v2/format/README.md deleted file mode 100644 index 5d11cc6b9..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# format - -a low-level string formatting library that takes arbitrary input types as interfaces, and arguments as a struct. this does not contain any printf-like argument parsing, only log-friendly serialization of arbitrary input arguments. (noting that our output is noticably more log-friendly for struct / map types than stdlib "fmt"). - -benchmarks: -```shell -goos: linux -goarch: amd64 -pkg: codeberg.org/gruf/go-kv/v2/format -cpu: AMD Ryzen 7 7840U w/ Radeon 780M Graphics - -# go-kv/v2/format (i.e. latest) -BenchmarkFormatV2Append -BenchmarkFormatV2Append-16 590422 1977 ns/op 488 B/op 23 allocs/op -BenchmarkFormatV2AppendVerbose -BenchmarkFormatV2AppendVerbose-16 375628 2981 ns/op 1704 B/op 45 allocs/op - -# go-kv/format (i.e. v1) -BenchmarkFormatAppend -BenchmarkFormatAppend-16 208357 5883 ns/op 2624 B/op 169 allocs/op -BenchmarkFormatAppendVerbose -BenchmarkFormatAppendVerbose-16 35916 33563 ns/op 3734 B/op 208 allocs/op - -# fmt (i.e. stdlib) -BenchmarkFmtAppend -BenchmarkFmtAppend-16 147722 8418 ns/op 4747 B/op 191 allocs/op -BenchmarkFmtAppendVerbose -BenchmarkFmtAppendVerbose-16 167112 7238 ns/op 4401 B/op 178 allocs/op - -PASS -ok codeberg.org/gruf/go-kv/v2/format -``` diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/abi.go b/vendor/codeberg.org/gruf/go-kv/v2/format/abi.go deleted file mode 100644 index 16b9c8cb9..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/abi.go +++ /dev/null @@ -1,25 +0,0 @@ -//go:build go1.24 && !go1.26 - -package format - -import ( - "reflect" - "unsafe" - - "codeberg.org/gruf/go-xunsafe" -) - -// add returns the ptr addition of starting ptr and a delta. -func add(ptr unsafe.Pointer, delta uintptr) unsafe.Pointer { - return unsafe.Pointer(uintptr(ptr) + delta) -} - -// typeof is short-hand for reflect.TypeFor[T](). -func typeof[T any]() reflect.Type { - return reflect.TypeFor[T]() -} - -const ( - // custom xunsafe.Reflect_flag to indicate key types. - flagKeyType xunsafe.Reflect_flag = 1 << 10 -) diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/args.go b/vendor/codeberg.org/gruf/go-kv/v2/format/args.go deleted file mode 100644 index c85a04d26..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/args.go +++ /dev/null @@ -1,247 +0,0 @@ -package format - -const ( - // TypeMask when set in argument flags - // indicates that type information of - // the passed value, and all nested types, - // should be included in formatted output. - TypeMask = uint64(1) << 0 - - // LogfmtMask when set in argument flags - // indicates that strings should be escaped - // and quoted only where necessary. i.e. if - // it contains any unsafe ASCII chars or double - // quotes it will be quoted and escaped, if it - // contains any spaces it will be quoted, and - // all else will be printed as-is. This proves - // particularly well readable in key-value types. - LogfmtMask = uint64(1) << 1 - - // NumberMask when set in argument flags - // indicates that where possible value - // types should be formatted as numbers, - // i.e. byte or rune types. - NumberMask = uint64(1) << 2 - - // TextMask when set in argument flags - // indicates that where possible value - // types should be formatted as text, - // i.e. []byte or []rune types. - TextMask = uint64(1) << 3 - - // QuotedTextMask when set in argument flags - // indicates that text should always be quoted. - QuotedTextMask = uint64(1) << 4 - - // QuotedAsciiMask when set in argument flags - // indicates that text should always be quoted, - // and escaped as ASCII characters where needed. - QuotedAsciiMask = uint64(1) << 5 - - // NoMethodMask when set in argument flags - // indicates that where a type supports a - // known method, (e.g. Error() or String()), - // this should not be used for formatting - // instead treating as a method-less type. - // e.g. printing the entire struct value of - // a &url.URL{} without calling String(). - NoMethodMask = uint64(1) << 6 -) - -var ( - // default set of Args. - defaultArgs = Args{ - Flags: LogfmtMask | TextMask, - Int: IntArgs{Base: 10}, - Uint: IntArgs{Base: 10}, - Float: FloatArgs{Fmt: 'g', Prec: -1}, - Complex: ComplexArgs{ - Real: FloatArgs{Fmt: 'g', Prec: -1}, - Imag: FloatArgs{Fmt: 'g', Prec: -1}, - }, - } - - // zeroArgs used for checking - // zero value Arg{} fields. - zeroArgs Args -) - -// DefaultArgs returns default -// set of formatter arguments. -func DefaultArgs() Args { - return defaultArgs -} - -// Args contains arguments -// for a call to a FormatFunc. -type Args struct { - - // Boolean argument - // flags as bit-field. - Flags uint64 - - // Integer - // arguments. - // i.e. for: - // - int - // - int8 - // - int16 - // - int32 (treated as rune char, number with NumberMask) - // - int64 - Int IntArgs - - // Unsigned - // integer - // arguments. - // i.e. for: - // - uint - // - uint8 (treated as byte char, number with NumberMask) - // - uint16 - // - uint32 - // - uint64 - Uint IntArgs - - // Float - // arguments. - // i.e. for: - // - float32 - // - float64 - Float FloatArgs - - // Complex - // arguments. - // i.e. for: - // - complex64 - // - complex128 - Complex ComplexArgs -} - -// IntArgs provides a set of -// arguments for customizing -// integer number serialization. -type IntArgs struct { - Base int - Pad int -} - -// FloatArgs provides a set of -// arguments for customizing -// float number serialization. -type FloatArgs struct { - Fmt byte - Prec int -} - -// ComplexArgs provides a set of -// arguments for customizing complex -// number serialization, as real and -// imaginary float number parts. -type ComplexArgs struct { - Real FloatArgs - Imag FloatArgs -} - -// WithType returns if TypeMask is set. -func (a *Args) WithType() bool { - return a.Flags&TypeMask != 0 -} - -// Logfmt returns if LogfmtMask is set. -func (a *Args) Logfmt() bool { - return a.Flags&LogfmtMask != 0 -} - -// AsNumber returns if NumberMask is set. -func (a *Args) AsNumber() bool { - return a.Flags&NumberMask != 0 -} - -// AsText returns if TextMask is set. -func (a *Args) AsText() bool { - return a.Flags&TextMask != 0 -} - -// AsQuotedText returns if QuotedTextMask is set. -func (a *Args) AsQuotedText() bool { - return a.Flags&QuotedTextMask != 0 -} - -// AsQuotedASCII returns if QuotedAsciiMask is set. -func (a *Args) AsQuotedASCII() bool { - return a.Flags&QuotedAsciiMask != 0 -} - -// NoMethod returns if NoMethodMask is set. -func (a *Args) NoMethod() bool { - return a.Flags&NoMethodMask != 0 -} - -// SetWithType sets the TypeMask bit. -func (a *Args) SetWithType() { - a.Flags = a.Flags | TypeMask -} - -// SetLogfmt sets the LogfmtMask bit. -func (a *Args) SetLogfmt() { - a.Flags = a.Flags | LogfmtMask -} - -// SetAsNumber sets the NumberMask bit. -func (a *Args) SetAsNumber() { - a.Flags = a.Flags | NumberMask -} - -// SetAsText sets the TextMask bit. -func (a *Args) SetAsText() { - a.Flags = a.Flags | TextMask -} - -// SetAsQuotedText sets the QuotedTextMask bit. -func (a *Args) SetAsQuotedText() { - a.Flags = a.Flags | QuotedTextMask -} - -// SetAsQuotedASCII sets the QuotedAsciiMask bit. -func (a *Args) SetAsQuotedASCII() { - a.Flags = a.Flags | QuotedAsciiMask -} - -// SetNoMethod sets the NoMethodMask bit. -func (a *Args) SetNoMethod() { - a.Flags = a.Flags | NoMethodMask -} - -// UnsetWithType unsets the TypeMask bit. -func (a *Args) UnsetWithType() { - a.Flags = a.Flags & ^TypeMask -} - -// UnsetLogfmt unsets the LogfmtMask bit. -func (a *Args) UnsetLogfmt() { - a.Flags = a.Flags & ^LogfmtMask -} - -// UnsetAsNumber unsets the NumberMask bit. -func (a *Args) UnsetAsNumber() { - a.Flags = a.Flags & ^NumberMask -} - -// UnsetAsText unsets the TextMask bit. -func (a *Args) UnsetAsText() { - a.Flags = a.Flags & ^TextMask -} - -// UnsetAsQuotedText unsets the QuotedTextMask bit. -func (a *Args) UnsetAsQuotedText() { - a.Flags = a.Flags & ^QuotedTextMask -} - -// UnsetAsQuotedASCII unsets the QuotedAsciiMask bit. -func (a *Args) UnsetAsQuotedASCII() { - a.Flags = a.Flags & ^QuotedAsciiMask -} - -// UnsetNoMethod unsets the NoMethodMask bit. -func (a *Args) UnsetNoMethod() { - a.Flags = a.Flags & ^NoMethodMask -} diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/array.go b/vendor/codeberg.org/gruf/go-kv/v2/format/array.go deleted file mode 100644 index 1ece16378..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/array.go +++ /dev/null @@ -1,235 +0,0 @@ -package format - -import ( - "unsafe" - - "codeberg.org/gruf/go-xunsafe" -) - -// iterArrayType returns a FormatFunc capable of iterating -// and formatting the given array type currently in TypeIter{}. -// note this will fetch a sub-FormatFunc for the array element -// type, and also handle special cases of [n]byte, [n]rune arrays. -func (fmt *Formatter) iterArrayType(t xunsafe.TypeIter) FormatFunc { - - // Array element type. - elem := t.Type.Elem() - - // Get nested elem TypeIter with appropriate flags. - flags := xunsafe.ReflectArrayElemFlags(t.Flag, elem) - et := t.Child(elem, flags) - - // Get elem format func. - fn := fmt.loadOrGet(et) - if fn == nil { - panic("unreachable") - } - - // Handle possible sizes. - switch t.Type.Len() { - case 0: - return emptyArrayType(t) - case 1: - return iterSingleArrayType(t, fn) - default: - return iterMultiArrayType(t, fn) - } -} - -func emptyArrayType(t xunsafe.TypeIter) FormatFunc { - if !needs_typestr(t) { - // Simply append empty. - return func(s *State) { - s.B = append(s.B, "[]"...) - } - } - - // Array type string with refs. - typestr := typestr_with_refs(t) - - // Append empty with type. - return func(s *State) { - if s.A.WithType() { - s.B = append(s.B, typestr...) - s.B = append(s.B, "{}"...) - } else { - s.B = append(s.B, "[]"...) - } - } -} - -func iterSingleArrayType(t xunsafe.TypeIter, fn FormatFunc) FormatFunc { - if !needs_typestr(t) { - return func(s *State) { - // Wrap 'fn' in braces. - s.B = append(s.B, '[') - fn(s) - s.B = append(s.B, ']') - } - } - - // Array type string with refs. - typestr := typestr_with_refs(t) - - // Wrap in type+braces. - return func(s *State) { - - // Open / close braces. - var open, close uint8 - open, close = '[', ']' - - // Include type info. - if s.A.WithType() { - s.B = append(s.B, typestr...) - open, close = '{', '}' - } - - // Wrap 'fn' in braces. - s.B = append(s.B, open) - fn(s) - s.B = append(s.B, close) - } -} - -func iterMultiArrayType(t xunsafe.TypeIter, fn FormatFunc) FormatFunc { - // Array element in-memory size. - esz := t.Type.Elem().Size() - - // Number of elements. - n := t.Type.Len() - - if !needs_typestr(t) { - // Wrap elems in braces. - return func(s *State) { - ptr := s.P - - // Prepend array brace. - s.B = append(s.B, '[') - - for i := 0; i < n; i++ { - // Format at array index. - offset := esz * uintptr(i) - s.P = add(ptr, offset) - fn(s) - - // Append separator. - s.B = append(s.B, ',') - } - - // Drop final space. - s.B = s.B[:len(s.B)-1] - - // Prepend array brace. - s.B = append(s.B, ']') - } - } - - // Array type string with refs. - typestr := typestr_with_refs(t) - - // Wrap in type+braces. - return func(s *State) { - ptr := s.P - - // Open / close braces. - var open, close uint8 - open, close = '[', ']' - - // Include type info. - if s.A.WithType() { - s.B = append(s.B, typestr...) - open, close = '{', '}' - } - - // Prepend array brace. - s.B = append(s.B, open) - - for i := 0; i < n; i++ { - // Format at array index. - offset := esz * uintptr(i) - s.P = add(ptr, offset) - fn(s) - - // Append separator. - s.B = append(s.B, ',') - } - - // Drop final comma. - s.B = s.B[:len(s.B)-1] - - // Prepend array brace. - s.B = append(s.B, close) - } -} - -func wrapByteArray(t xunsafe.TypeIter, fn FormatFunc) FormatFunc { - n := t.Type.Len() - if !needs_typestr(t) { - return func(s *State) { - if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() { - var v string - p := (*xunsafe.Unsafeheader_String)(unsafe.Pointer(&v)) - p.Len = n - p.Data = s.P - appendString(s, v) - } else { - fn(s) - } - } - } - typestr := typestr_with_ptrs(t) - return func(s *State) { - if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() { - var v string - p := (*xunsafe.Unsafeheader_String)(unsafe.Pointer(&v)) - p.Len = n - p.Data = s.P - if s.A.WithType() { - s.B = append(s.B, "("+typestr+")("...) - appendString(s, v) - s.B = append(s.B, ")"...) - } else { - appendString(s, v) - } - } else { - fn(s) - } - } -} - -func wrapRuneArray(t xunsafe.TypeIter, fn FormatFunc) FormatFunc { - n := t.Type.Len() - if !needs_typestr(t) { - return func(s *State) { - if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() { - var v []rune - p := (*xunsafe.Unsafeheader_Slice)(unsafe.Pointer(&v)) - p.Cap = n - p.Len = n - p.Data = s.P - appendString(s, string(v)) - } else { - fn(s) - } - } - } - typestr := typestr_with_ptrs(t) - return func(s *State) { - if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() { - var v []rune - p := (*xunsafe.Unsafeheader_Slice)(unsafe.Pointer(&v)) - p.Cap = n - p.Len = n - p.Data = s.P - if s.A.WithType() { - s.B = append(s.B, "("+typestr+")("...) - appendString(s, string(v)) - s.B = append(s.B, ")"...) - } else { - appendString(s, string(v)) - } - } else { - fn(s) - } - } -} diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/cache.go b/vendor/codeberg.org/gruf/go-kv/v2/format/cache.go deleted file mode 100644 index 8c9bfa210..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/cache.go +++ /dev/null @@ -1,60 +0,0 @@ -package format - -import ( - "sync/atomic" - "unsafe" - - "codeberg.org/gruf/go-xunsafe" -) - -// cache is a concurrency-safe map[xunsafe.TypeInfo]FormatFunc -// cache, designed for heavy reads but with unfortunately expensive -// writes. it is designed such that after some initial load period -// in which functions are cached by types, all future ops are reads. -type cache struct{ p unsafe.Pointer } - -// Get will check cache for format func under key. -func (c *cache) Get(t xunsafe.TypeInfo) FormatFunc { - if p := c.load(); p != nil { - return (*p)[t] - } - return nil -} - -// Put will place given format func in cache under key, if not already exists. -func (c *cache) Put(t xunsafe.TypeInfo, fn FormatFunc) { - for { - p := c.load() - - var cache map[xunsafe.TypeInfo]FormatFunc - - if p != nil { - if _, ok := (*p)[t]; ok { - return - } - - cache = make(map[xunsafe.TypeInfo]FormatFunc, len(*p)+1) - for key, value := range *p { - cache[key] = value - } - } else { - cache = make(map[xunsafe.TypeInfo]FormatFunc, 1) - } - - cache[t] = fn - - if c.cas(p, &cache) { - return - } - } -} - -// load is a typed wrapper around atomic.LoadPointer(). -func (c *cache) load() *map[xunsafe.TypeInfo]FormatFunc { - return (*map[xunsafe.TypeInfo]FormatFunc)(atomic.LoadPointer(&c.p)) -} - -// cas is a typed wrapper around atomic.CompareAndSwapPointer(). -func (c *cache) cas(old, new *map[xunsafe.TypeInfo]FormatFunc) bool { - return atomic.CompareAndSwapPointer(&c.p, unsafe.Pointer(old), unsafe.Pointer(new)) -} diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/format.go b/vendor/codeberg.org/gruf/go-kv/v2/format/format.go deleted file mode 100644 index 0629c6f96..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/format.go +++ /dev/null @@ -1,687 +0,0 @@ -package format - -import ( - "reflect" - "runtime/debug" - "strconv" - "unsafe" - - "codeberg.org/gruf/go-xunsafe" -) - -// Global formatter instance. -var Global Formatter - -// FormatFunc defines a function capable of formatting -// the value contained in State{}.P, based on args in -// State{}.A, storing the result in buffer State{}.B. -type FormatFunc func(*State) - -// State contains all necessary -// arguments, buffer and value -// data pointer required for a -// FormatFunc operation, in a -// reusable structure if wanted. -type State struct { - - // A contains args - // passed to this - // FormatFunc call. - A Args - - // B is the buffer - // that values will - // be formatted into. - B []byte - - // P contains a ptr - // to the value type - // being formatted. - P unsafe.Pointer - - // stores pointers to the - // recent interface values - // we have visited. to prevent - // possible recursion of - // runtime defined data. - ifaces ptr_ring -} - -// ptr_ring size. -const ringsz = 16 - -// ptr_ring is a ring buffer of pointers, -// purposely stored as uintptrs as all we -// need them for is integer comparisons and -// we don't want to hold-up the GC. -type ptr_ring struct { - p [ringsz]uintptr - n uint8 -} - -func (p *ptr_ring) contains(ptr unsafe.Pointer) bool { - for _, eptr := range p.p { - if uintptr(ptr) == eptr { - return true - } - } - return false -} - -func (p *ptr_ring) set(ptr unsafe.Pointer) { - p.p[p.n%ringsz] = uintptr(ptr) - p.n++ -} - -func (p *ptr_ring) clear() { - p.p = [ringsz]uintptr{} - p.n = 0 -} - -// Formatter provides access to value formatting -// provided by this library. It encompasses a set -// of configurable default arguments for when none -// are set, and an internal concurrency-safe cache -// of FormatFuncs to passed value type. -type Formatter struct { - - // Defaults defines the default - // set of arguments to use when - // none are supplied to calls to - // Append() and AppendState(). - Defaults Args - - // internal - // format func - // cache map. - fns cache -} - -// Append calls AppendState() with a newly allocated State{}, returning byte buffer. -func (fmt *Formatter) Append(buf []byte, value any, args Args) []byte { - s := new(State) - s.A = args - s.B = buf - fmt.AppendState(s, value) - return s.B -} - -// AppendState will format the given value into the given -// State{}'s byte buffer, using currently-set arguments. -func (fmt *Formatter) AppendState(s *State, value any) { - switch { - case s.A != zeroArgs: - break - case fmt.Defaults != zeroArgs: - // use fmt defaults. - s.A = fmt.Defaults - default: - // global defaults. - s.A = defaultArgs - } - t := xunsafe.TypeIterFrom(value) - s.P = xunsafe.UnpackEface(value) - s.ifaces.clear() - s.ifaces.set(s.P) - fmt.loadOrStore(t)(s) -} - -func (fmt *Formatter) loadOrGet(t xunsafe.TypeIter) FormatFunc { - // Look for existing stored - // func under this type key. - fn := fmt.fns.Get(t.TypeInfo) - - if fn == nil { - // Load format func - // for typecontext. - fn = fmt.get(t) - if fn == nil { - panic("unreachable") - } - } - - return fn -} - -func (fmt *Formatter) loadOrStore(t xunsafe.TypeIter) FormatFunc { - // Get cache key. - key := t.TypeInfo - - // Look for existing stored - // func under this type key. - fn := fmt.fns.Get(key) - - if fn == nil { - // Load format func - // for typecontext. - fn = fmt.get(t) - if fn == nil { - panic("unreachable") - } - - // Store under type. - fmt.fns.Put(key, fn) - } - - return fn -} - -var ( - // reflectTypeType is the reflected type of the reflect type, - // used in fmt.get() to prevent iter of internal ABI structs. - reflectTypeType = reflect.TypeOf(reflect.TypeOf(0)) - - // stringable int types. - byteType = typeof[byte]() - runeType = typeof[rune]() - - // stringable slice types. - bytesType = typeof[[]byte]() - runesType = typeof[[]rune]() -) - -func (fmt *Formatter) get(t xunsafe.TypeIter) (fn FormatFunc) { - if t.Type == nil { - // catch nil type. - return appendNil - } - - defer func() { - if r := recover(); r != nil { - debug.PrintStack() - panic(r) // keep panicking - } else if fn == nil { - panic("nil func") - } - - // Don't allow method functions for map keys, - // to prevent situation of the method receiver - // attempting to modify stored map key itself. - if t.Flag&flagKeyType != 0 { - return - } - - // Check if type supports known method receiver. - if methodFn := getMethodType(t); methodFn != nil { - - // Keep ptr to existing - // non-method format fn. - noMethodFn := fn - - // Wrap 'fn' to switch - // between method / none. - fn = func(s *State) { - if s.A.NoMethod() { - noMethodFn(s) - } else { - methodFn(s) - } - } - } - }() - - if t.Type == reflectTypeType { - // DO NOT iterate down internal ABI - // types, some are in non-GC memory. - return getPointerType(t) - } - - if !visit(t) { - // On type recursion simply - // format as raw pointer. - return getPointerType(t) - } - - // Get func for type kind. - switch t.Type.Kind() { - case reflect.Interface: - return fmt.getInterfaceType(t) - case reflect.String: - return getStringType(t) - case reflect.Bool: - return getBoolType(t) - case reflect.Int, - reflect.Int8, - reflect.Int16, - reflect.Int32, - reflect.Int64: - return getIntType(t) - case reflect.Uint, - reflect.Uint8, - reflect.Uint16, - reflect.Uint32, - reflect.Uint64: - return getUintType(t) - case reflect.Float32, - reflect.Float64: - return getFloatType(t) - case reflect.Complex64, - reflect.Complex128: - return getComplexType(t) - case reflect.Pointer: - return fmt.derefPointerType(t) - case reflect.Array: - elem := t.Type.Elem() - switch fn := fmt.iterArrayType(t); { - case elem.AssignableTo(byteType): - return wrapByteArray(t, fn) - case elem.AssignableTo(runeType): - return wrapRuneArray(t, fn) - default: - return fn - } - case reflect.Slice: - switch fn := fmt.iterSliceType(t); { - case t.Type.AssignableTo(bytesType): - return wrapByteSlice(t, fn) - case t.Type.AssignableTo(runesType): - return wrapRuneSlice(t, fn) - default: - return fn - } - case reflect.Struct: - return fmt.iterStructType(t) - case reflect.Map: - return fmt.iterMapType(t) - default: - return getPointerType(t) - } -} - -func (fmt *Formatter) getInterfaceType(t xunsafe.TypeIter) FormatFunc { - if t.Type.NumMethod() == 0 { - return func(s *State) { - // Unpack empty interface. - eface := *(*any)(s.P) - s.P = xunsafe.UnpackEface(eface) - - // Get reflected type information. - rtype := reflect.TypeOf(eface) - if rtype == nil { - appendNil(s) - return - } - - // Check for ptr recursion. - if s.ifaces.contains(s.P) { - getPointerType(t)(s) - return - } - - // Store value ptr. - s.ifaces.set(s.P) - - // Wrap before load. - var t xunsafe.TypeIter - t.Flag = xunsafe.ReflectIfaceElemFlags(rtype) - t.Type = rtype - - // Load + pass to func. - fmt.loadOrStore(t)(s) - } - } else { - return func(s *State) { - // Unpack interface-with-method ptr. - iface := *(*interface{ M() })(s.P) - s.P = xunsafe.UnpackEface(iface) - - // Get reflected type information. - rtype := reflect.TypeOf(iface) - if rtype == nil { - appendNil(s) - return - } - - // Check for ptr recursion. - if s.ifaces.contains(s.P) { - getPointerType(t)(s) - return - } - - // Store value ptr. - s.ifaces.set(s.P) - - // Wrap before load. - var t xunsafe.TypeIter - t.Flag = xunsafe.ReflectIfaceElemFlags(rtype) - t.Type = rtype - - // Load + pass to func. - fmt.loadOrStore(t)(s) - } - } -} - -func getStringType(t xunsafe.TypeIter) FormatFunc { - return with_typestr_ptrs(t, func(s *State) { - appendString(s, *(*string)(s.P)) - }) -} - -func getBoolType(t xunsafe.TypeIter) FormatFunc { - return with_typestr_ptrs(t, func(s *State) { - s.B = strconv.AppendBool(s.B, *(*bool)(s.P)) - }) -} - -func getIntType(t xunsafe.TypeIter) FormatFunc { - switch t.Type.Bits() { - case 8: - return with_typestr_ptrs(t, func(s *State) { - appendInt(s, int64(*(*int8)(s.P))) - }) - case 16: - return with_typestr_ptrs(t, func(s *State) { - appendInt(s, int64(*(*int16)(s.P))) - }) - case 32: - return with_typestr_ptrs(t, func(s *State) { - switch { - case s.A.AsNumber(): - // fallthrough - case s.A.AsQuotedASCII(): - s.B = strconv.AppendQuoteRuneToASCII(s.B, *(*rune)(s.P)) - return - case s.A.AsText() || s.A.AsQuotedText(): - s.B = strconv.AppendQuoteRune(s.B, *(*rune)(s.P)) - return - } - appendInt(s, int64(*(*int32)(s.P))) - }) - case 64: - return with_typestr_ptrs(t, func(s *State) { - appendInt(s, int64(*(*int64)(s.P))) - }) - default: - panic("unreachable") - } -} - -func getUintType(t xunsafe.TypeIter) FormatFunc { - switch t.Type.Bits() { - case 8: - return with_typestr_ptrs(t, func(s *State) { - switch { - case s.A.AsNumber(): - // fallthrough - case s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII(): - s.B = AppendQuoteByte(s.B, *(*byte)(s.P)) - return - } - appendUint(s, uint64(*(*uint8)(s.P))) - }) - case 16: - return with_typestr_ptrs(t, func(s *State) { - appendUint(s, uint64(*(*uint16)(s.P))) - }) - case 32: - return with_typestr_ptrs(t, func(s *State) { - appendUint(s, uint64(*(*uint32)(s.P))) - }) - case 64: - return with_typestr_ptrs(t, func(s *State) { - appendUint(s, uint64(*(*uint64)(s.P))) - }) - default: - panic("unreachable") - } -} - -func getFloatType(t xunsafe.TypeIter) FormatFunc { - switch t.Type.Bits() { - case 32: - return with_typestr_ptrs(t, func(s *State) { - appendFloat(s, float64(*(*float32)(s.P)), 32) - }) - case 64: - return with_typestr_ptrs(t, func(s *State) { - appendFloat(s, float64(*(*float64)(s.P)), 64) - }) - default: - panic("unreachable") - } -} - -func getComplexType(t xunsafe.TypeIter) FormatFunc { - switch t.Type.Bits() { - case 64: - return with_typestr_ptrs(t, func(s *State) { - v := *(*complex64)(s.P) - r, i := real(v), imag(v) - appendComplex(s, float64(r), float64(i), 32) - }) - case 128: - return with_typestr_ptrs(t, func(s *State) { - v := *(*complex128)(s.P) - r, i := real(v), imag(v) - appendComplex(s, float64(r), float64(i), 64) - }) - default: - panic("unreachable") - } -} - -func getPointerType(t xunsafe.TypeIter) FormatFunc { - switch t.Indirect() { - case true: - return with_typestr_ptrs(t, func(s *State) { - s.P = *(*unsafe.Pointer)(s.P) - appendPointer(s, s.P) - }) - case false: - return with_typestr_ptrs(t, func(s *State) { - appendPointer(s, s.P) - }) - default: - panic("unreachable") - } -} - -func with_typestr_ptrs(t xunsafe.TypeIter, fn FormatFunc) FormatFunc { - if fn == nil { - panic("nil func") - } - - // Check for type wrapping. - if !needs_typestr(t) { - return fn - } - - // Get type string with pointers. - typestr := typestr_with_ptrs(t) - - // Wrap format func to include - // type information when needed. - return func(s *State) { - if s.A.WithType() { - s.B = append(s.B, "("+typestr+")("...) - fn(s) - s.B = append(s.B, ")"...) - } else { - fn(s) - } - } -} - -func appendString(s *State, v string) { - switch { - case s.A.WithType(): - if len(v) > SingleTermLine || !IsSafeASCII(v) { - // Requires quoting AND escaping - s.B = strconv.AppendQuote(s.B, v) - } else if ContainsDoubleQuote(v) { - // Contains double quotes, needs escaping - s.B = append(s.B, '"') - s.B = AppendEscape(s.B, v) - s.B = append(s.B, '"') - } else { - // All else, needs quotes - s.B = append(s.B, '"') - s.B = append(s.B, v...) - s.B = append(s.B, '"') - } - case s.A.Logfmt(): - if len(v) > SingleTermLine || !IsSafeASCII(v) { - // Requires quoting AND escaping - s.B = strconv.AppendQuote(s.B, v) - } else if ContainsDoubleQuote(v) { - // Contains double quotes, needs escaping - s.B = append(s.B, '"') - s.B = AppendEscape(s.B, v) - s.B = append(s.B, '"') - } else if len(v) == 0 || ContainsSpaceOrTab(v) { - // Contains space / empty, needs quotes - s.B = append(s.B, '"') - s.B = append(s.B, v...) - s.B = append(s.B, '"') - } else { - // All else write as-is - s.B = append(s.B, v...) - } - case s.A.AsQuotedText(): - s.B = strconv.AppendQuote(s.B, v) - case s.A.AsQuotedASCII(): - s.B = strconv.AppendQuoteToASCII(s.B, v) - default: - s.B = append(s.B, v...) - } -} - -func appendInt(s *State, v int64) { - args := s.A.Int - - // Set argument defaults. - if args == zeroArgs.Int { - args = defaultArgs.Int - } - - // Add any padding. - if args.Pad > 0 { - const zeros = `00000000000000000000` - if args.Pad > len(zeros) { - panic("cannot pad > " + zeros) - } - - if v == 0 { - s.B = append(s.B, zeros[:args.Pad]...) - return - } - - // Get absolute. - abs := abs64(v) - - // Get number of required chars. - chars := int(v / int64(args.Base)) - if v%int64(args.Base) != 0 { - chars++ - } - - if abs != v { - // If this is a negative value, - // prepend minus ourselves and - // set value as the absolute. - s.B = append(s.B, '-') - v = abs - } - - // Prepend required zeros. - n := args.Pad - chars - s.B = append(s.B, zeros[:n]...) - } - - // Append value as signed integer w/ args. - s.B = strconv.AppendInt(s.B, v, args.Base) -} - -func appendUint(s *State, v uint64) { - args := s.A.Int - - // Set argument defaults. - if args == zeroArgs.Int { - args = defaultArgs.Int - } - - // Add any padding. - if args.Pad > 0 { - const zeros = `00000000000000000000` - if args.Pad > len(zeros) { - panic("cannot pad > " + zeros) - } - - if v == 0 { - s.B = append(s.B, zeros[:args.Pad]...) - return - } - - // Get number of required chars. - chars := int(v / uint64(args.Base)) - if v%uint64(args.Base) != 0 { - chars++ - } - - // Prepend required zeros. - n := args.Pad - chars - s.B = append(s.B, zeros[:n]...) - } - - // Append value as unsigned integer w/ args. - s.B = strconv.AppendUint(s.B, v, args.Base) -} - -func appendFloat(s *State, v float64, bits int) { - args := s.A.Float - - // Set argument defaults. - if args == zeroArgs.Float { - args = defaultArgs.Float - } - - // Append value as float${bit} w/ args. - s.B = strconv.AppendFloat(s.B, float64(v), - args.Fmt, args.Prec, bits) -} - -func appendComplex(s *State, r, i float64, bits int) { - args := s.A.Complex - - // Set argument defaults. - if args == zeroArgs.Complex { - args = defaultArgs.Complex - } - - // Append real value as float${bit} w/ args. - s.B = strconv.AppendFloat(s.B, float64(r), - args.Real.Fmt, args.Real.Prec, bits) - s.B = append(s.B, '+') - - // Append imag value as float${bit} w/ args. - s.B = strconv.AppendFloat(s.B, float64(i), - args.Imag.Fmt, args.Imag.Prec, bits) - s.B = append(s.B, 'i') -} - -func appendPointer(s *State, v unsafe.Pointer) { - if v != nil { - s.B = append(s.B, "0x"...) - s.B = strconv.AppendUint(s.B, uint64(uintptr(v)), 16) - } else { - appendNil(s) - } -} - -func appendNilType(s *State, typestr string) { - if s.A.WithType() { - s.B = append(s.B, "("+typestr+")(<nil>)"...) - } else { - s.B = append(s.B, "<nil>"...) - } -} - -func appendNil(s *State) { - s.B = append(s.B, "<nil>"...) -} - -func abs64(i int64) int64 { - u := uint64(i >> 63) - return (i ^ int64(u)) + int64(u&1) -} diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/formatting.go b/vendor/codeberg.org/gruf/go-kv/v2/format/formatting.go deleted file mode 100644 index e09edbefc..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/formatting.go +++ /dev/null @@ -1,161 +0,0 @@ -package format - -import ( - "strings" - "unicode" - "unicode/utf8" -) - -const ( - // SingleTermLine: beyond a certain length of string, all of the - // extra checks to handle quoting/not-quoting add a significant - // amount of extra processing time. Quoting in this manner only really - // effects readability on a single line, so a max string length that - // encompasses the maximum number of columns on *most* terminals was - // selected. This was chosen using the metric that 1080p is one of the - // most common display resolutions, and that a relatively small font size - // of 7 requires 223 columns. So 256 should be >= $COLUMNS (fullscreen) - // in 99% of usecases (these figures all pulled out of my ass). - SingleTermLine = 256 -) - -// IsSafeASCII checks whether string is printable (i.e. non-control char) ASCII text. -func IsSafeASCII(str string) bool { - for _, r := range str { - if (r < ' ' && r != '\t') || - r >= 0x7f { - return false - } - } - return true -} - -// ContainsSpaceOrTab checks if "s" contains space or tabs. EXPECTS ASCII. -func ContainsSpaceOrTab(s string) bool { - if i := strings.IndexByte(s, ' '); i >= 0 { - return true // note using indexbyte as it is ASM. - } else if i := strings.IndexByte(s, '\t'); i >= 0 { - return true - } - return false -} - -// ContainsDoubleQuote checks if "s" contains a double quote. EXPECTS ASCII. -func ContainsDoubleQuote(s string) bool { - return (strings.IndexByte(s, '"') >= 0) -} - -// AppendEscape will append 's' to 'buf' and escape any double quotes. EXPECTS ASCII. -func AppendEscape(buf []byte, str string) []byte { - for i := range str { - switch str[i] { - case '\\': - // Append delimited '\' - buf = append(buf, '\\', '\\') - - case '"': - // Append delimited '"' - buf = append(buf, '\\', '"') - default: - // Append char as-is - buf = append(buf, str[i]) - } - } - return buf -} - -const hex = "0123456789abcdef" - -// AppendEscapeByte ... -func AppendEscapeByte(buf []byte, c byte) []byte { - switch c { - case '\a': - return append(buf, `\a`...) - case '\b': - return append(buf, `\b`...) - case '\f': - return append(buf, `\f`...) - case '\n': - return append(buf, `\n`...) - case '\r': - return append(buf, `\r`...) - case '\t': - return append(buf, `\t`...) - case '\v': - return append(buf, `\v`...) - case '\\': - return append(buf, `\\`...) - default: - if c < ' ' { - return append(buf, '\\', 'x', hex[c>>4], hex[c&0xF]) - } - return append(buf, c) - } -} - -// AppendQuoteByte ... -func AppendQuoteByte(buf []byte, c byte) []byte { - if c == '\'' { - return append(buf, `'\''`...) - } - buf = append(buf, '\'') - buf = AppendEscapeByte(buf, c) - buf = append(buf, '\'') - return buf -} - -// AppendEscapeRune ... -func AppendEscapeRune(buf []byte, r rune) []byte { - if unicode.IsPrint(r) { - return utf8.AppendRune(buf, r) - } - switch r { - case '\a': - return append(buf, `\a`...) - case '\b': - return append(buf, `\b`...) - case '\f': - return append(buf, `\f`...) - case '\n': - return append(buf, `\n`...) - case '\r': - return append(buf, `\r`...) - case '\t': - return append(buf, `\t`...) - case '\v': - return append(buf, `\v`...) - case '\\': - return append(buf, `\\`...) - default: - switch { - case r < ' ' || r == 0x7f: - buf = append(buf, `\x`...) - buf = append(buf, hex[byte(r)>>4]) - buf = append(buf, hex[byte(r)&0xF]) - case !utf8.ValidRune(r): - r = 0xFFFD - fallthrough - case r < 0x10000: - buf = append(buf, `\u`...) - buf = append(buf, - hex[r>>uint(12)&0xF], - hex[r>>uint(8)&0xF], - hex[r>>uint(4)&0xF], - hex[r>>uint(0)&0xF], - ) - default: - buf = append(buf, `\U`...) - buf = append(buf, - hex[r>>uint(28)&0xF], - hex[r>>uint(24)&0xF], - hex[r>>uint(20)&0xF], - hex[r>>uint(16)&0xF], - hex[r>>uint(12)&0xF], - hex[r>>uint(8)&0xF], - hex[r>>uint(4)&0xF], - hex[r>>uint(0)&0xF], - ) - } - } - return buf -} diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/map.go b/vendor/codeberg.org/gruf/go-kv/v2/format/map.go deleted file mode 100644 index a3c4acd60..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/map.go +++ /dev/null @@ -1,134 +0,0 @@ -package format - -import ( - "unsafe" - - "codeberg.org/gruf/go-xunsafe" -) - -// iterMapType returns a FormatFunc capable of iterating -// and formatting the given map type currently in TypeIter{}. -// note this will fetch sub-FormatFuncs for key / value types. -func (fmt *Formatter) iterMapType(t xunsafe.TypeIter) FormatFunc { - - // Key / value types. - key := t.Type.Key() - elem := t.Type.Elem() - - // Get nested k / v TypeIters with appropriate flags. - flagsKey := xunsafe.ReflectMapKeyFlags(key) | flagKeyType - flagsVal := xunsafe.ReflectMapElemFlags(elem) - kt := t.Child(key, flagsKey) - vt := t.Child(elem, flagsVal) - - // Get key format func. - kfn := fmt.loadOrGet(kt) - if kfn == nil { - panic("unreachable") - } - - // Get value format func. - vfn := fmt.loadOrGet(vt) - if vfn == nil { - panic("unreachable") - } - - // Final map type. - rtype := t.Type - flags := t.Flag - - // Map type string with ptrs / refs. - typestrPtrs := typestr_with_ptrs(t) - typestrRefs := typestr_with_refs(t) - - if !needs_typestr(t) { - return func(s *State) { - if s.P == nil || *(*unsafe.Pointer)(s.P) == nil { - // Append nil. - appendNil(s) - return - } - - // Build reflect value, and then a map iterator. - v := xunsafe.BuildReflectValue(rtype, s.P, flags) - i := xunsafe.GetMapIter(v) - - // Prepend object brace. - s.B = append(s.B, '{') - - // Before len. - l := len(s.B) - - for i.Next() { - // Pass to map key func. - s.P = xunsafe.Map_Key(i) - kfn(s) - - // Add key seperator. - s.B = append(s.B, '=') - - // Pass to map elem func. - s.P = xunsafe.Map_Elem(i) - vfn(s) - - // Add comma pair seperator. - s.B = append(s.B, ',', ' ') - } - - if len(s.B) != l { - // Drop final ", ". - s.B = s.B[:len(s.B)-2] - } - - // Append object brace. - s.B = append(s.B, '}') - } - } - - return func(s *State) { - if s.P == nil || *(*unsafe.Pointer)(s.P) == nil { - // Append nil value with type. - appendNilType(s, typestrPtrs) - return - } - - // Build reflect value, and then a map iter. - v := xunsafe.BuildReflectValue(rtype, s.P, flags) - i := xunsafe.GetMapIter(v) - - // Include type info. - if s.A.WithType() { - s.B = append(s.B, typestrRefs...) - } - - // Prepend object brace. - s.B = append(s.B, '{') - - // Before len. - l := len(s.B) - - for i.Next() { - // Pass to map key func. - s.P = xunsafe.Map_Key(i) - kfn(s) - - // Add key seperator. - s.B = append(s.B, '=') - - // Pass to map elem func. - s.P = xunsafe.Map_Elem(i) - vfn(s) - - // Add comma pair seperator. - s.B = append(s.B, ',', ' ') - } - - if len(s.B) != l { - // Drop final ", ". - s.B = s.B[:len(s.B)-2] - } - - // Append object brace. - s.B = append(s.B, '}') - } -} diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/methods.go b/vendor/codeberg.org/gruf/go-kv/v2/format/methods.go deleted file mode 100644 index 4c0c1dbda..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/methods.go +++ /dev/null @@ -1,242 +0,0 @@ -package format - -import ( - "reflect" - "unsafe" - - "codeberg.org/gruf/go-xunsafe" -) - -type Stringer interface{ String() string } - -type Formattable interface{ Format(*State) } - -var ( - // stringer type for implement checks. - stringerType = typeof[Stringer]() - - // formattableType type for implement checks. - formattableType = typeof[Formattable]() - - // error type for implement checks. - errorType = typeof[error]() -) - -// getMethodType returns a *possible* FormatFunc to handle case -// of a type that implements any known interface{} types, else nil. -func getMethodType(t xunsafe.TypeIter) FormatFunc { - switch { - case t.Type.Implements(stringerType): - switch t.Type.Kind() { - case reflect.Interface: - return getInterfaceStringerType(t) - default: - return getConcreteStringerType(t) - } - case t.Type.Implements(formattableType): - switch t.Type.Kind() { - case reflect.Interface: - return getInterfaceFormattableType(t) - default: - return getConcreteFormattableType(t) - } - case t.Type.Implements(errorType): - switch t.Type.Kind() { - case reflect.Interface: - return getInterfaceErrorType(t) - default: - return getConcreteErrorType(t) - } - default: - return nil - } -} - -// getInterfaceStringerType returns a FormatFunc to handle case of an interface{} -// type that implements Stringer{}, i.e. Stringer{} itself and any superset of. -func getInterfaceStringerType(t xunsafe.TypeIter) FormatFunc { - switch t.Indirect() && !t.IfaceIndir() { - case true: - return with_typestr_ptrs(t, func(s *State) { - s.P = *(*unsafe.Pointer)(s.P) - if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil { - appendNil(s) - return - } - v := *(*Stringer)(s.P) - appendString(s, v.String()) - }) - case false: - return with_typestr_ptrs(t, func(s *State) { - if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil { - appendNil(s) - return - } - v := *(*Stringer)(s.P) - appendString(s, v.String()) - }) - default: - panic("unreachable") - } -} - -// getConcreteStringerType returns a FormatFunc to handle case of concrete -// (i.e. non-interface{}) type that has a Stringer{} method receiver. -func getConcreteStringerType(t xunsafe.TypeIter) FormatFunc { - itab := xunsafe.GetIfaceITab[Stringer](t.Type) - switch { - case t.Indirect() && !t.IfaceIndir(): - return with_typestr_ptrs(t, func(s *State) { - s.P = *(*unsafe.Pointer)(s.P) - if s.P == nil { - appendNil(s) - return - } - v := *(*Stringer)(xunsafe.PackIface(itab, s.P)) - appendString(s, v.String()) - }) - case t.Type.Kind() == reflect.Pointer && t.Type.Implements(stringerType): - // if the interface implementation is received by - // value type, the pointer type will also support - // it but it requires an extra dereference check. - return with_typestr_ptrs(t, func(s *State) { - if s.P == nil { - appendNil(s) - return - } - v := *(*Stringer)(xunsafe.PackIface(itab, s.P)) - appendString(s, v.String()) - }) - default: - return with_typestr_ptrs(t, func(s *State) { - v := *(*Stringer)(xunsafe.PackIface(itab, s.P)) - appendString(s, v.String()) - }) - } -} - -// getInterfaceFormattableType returns a FormatFunc to handle case of an interface{} -// type that implements Formattable{}, i.e. Formattable{} itself and any superset of. -func getInterfaceFormattableType(t xunsafe.TypeIter) FormatFunc { - switch t.Indirect() && !t.IfaceIndir() { - case true: - return with_typestr_ptrs(t, func(s *State) { - s.P = *(*unsafe.Pointer)(s.P) - if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil { - appendNil(s) - return - } - v := *(*Formattable)(s.P) - v.Format(s) - }) - case false: - return with_typestr_ptrs(t, func(s *State) { - if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil { - appendNil(s) - return - } - v := *(*Formattable)(s.P) - v.Format(s) - }) - default: - panic("unreachable") - } -} - -// getConcreteFormattableType returns a FormatFunc to handle case of concrete -// (i.e. non-interface{}) type that has a Formattable{} method receiver. -func getConcreteFormattableType(t xunsafe.TypeIter) FormatFunc { - itab := xunsafe.GetIfaceITab[Formattable](t.Type) - switch { - case t.Indirect() && !t.IfaceIndir(): - return with_typestr_ptrs(t, func(s *State) { - s.P = *(*unsafe.Pointer)(s.P) - if s.P == nil { - appendNil(s) - return - } - v := *(*Formattable)(xunsafe.PackIface(itab, s.P)) - v.Format(s) - }) - case t.Type.Kind() == reflect.Pointer && t.Type.Implements(formattableType): - // if the interface implementation is received by - // value type, the pointer type will also support - // it but it requires an extra dereference check. - return with_typestr_ptrs(t, func(s *State) { - if s.P == nil { - appendNil(s) - return - } - v := *(*Formattable)(xunsafe.PackIface(itab, s.P)) - v.Format(s) - }) - default: - return with_typestr_ptrs(t, func(s *State) { - v := *(*Formattable)(xunsafe.PackIface(itab, s.P)) - v.Format(s) - }) - } -} - -// getInterfaceErrorType returns a FormatFunc to handle case of an interface{} -// type that implements error{}, i.e. error{} itself and any superset of. -func getInterfaceErrorType(t xunsafe.TypeIter) FormatFunc { - switch t.Indirect() && !t.IfaceIndir() { - case true: - return with_typestr_ptrs(t, func(s *State) { - s.P = *(*unsafe.Pointer)(s.P) - if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil { - appendNil(s) - return - } - v := *(*error)(s.P) - appendString(s, v.Error()) - }) - case false: - return with_typestr_ptrs(t, func(s *State) { - if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil { - appendNil(s) - return - } - v := *(*error)(s.P) - appendString(s, v.Error()) - }) - default: - panic("unreachable") - } -} - -// getConcreteErrorType returns a FormatFunc to handle case of concrete -// (i.e. non-interface{}) type that has an error{} method receiver. -func getConcreteErrorType(t xunsafe.TypeIter) FormatFunc { - itab := xunsafe.GetIfaceITab[error](t.Type) - switch { - case t.Indirect() && !t.IfaceIndir(): - return with_typestr_ptrs(t, func(s *State) { - s.P = *(*unsafe.Pointer)(s.P) - if s.P == nil { - appendNil(s) - return - } - v := *(*error)(xunsafe.PackIface(itab, s.P)) - appendString(s, v.Error()) - }) - case t.Type.Kind() == reflect.Pointer && t.Type.Implements(errorType): - // if the interface implementation is received by - // value type, the pointer type will also support - // it but it requires an extra dereference check. - return with_typestr_ptrs(t, func(s *State) { - if s.P == nil { - appendNil(s) - return - } - v := *(*error)(xunsafe.PackIface(itab, s.P)) - appendString(s, v.Error()) - }) - default: - return with_typestr_ptrs(t, func(s *State) { - v := *(*error)(xunsafe.PackIface(itab, s.P)) - appendString(s, v.Error()) - }) - } -} diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/pointer.go b/vendor/codeberg.org/gruf/go-kv/v2/format/pointer.go deleted file mode 100644 index ec1e2e15d..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/pointer.go +++ /dev/null @@ -1,130 +0,0 @@ -package format - -import ( - "reflect" - "unsafe" - - "codeberg.org/gruf/go-xunsafe" -) - -// derefPointerType returns a FormatFunc capable of dereferencing -// and formatting the given pointer type currently in TypeIter{}. -// note this will fetch a sub-FormatFunc for resulting value type. -func (fmt *Formatter) derefPointerType(t xunsafe.TypeIter) FormatFunc { - var n int - rtype := t.Type - flags := t.Flag - - // Iteratively dereference pointer types. - for rtype.Kind() == reflect.Pointer { - - // If this actual indirect memory, - // increase dereferences counter. - if flags&xunsafe.Reflect_flagIndir != 0 { - n++ - } - - // Get next elem type. - rtype = rtype.Elem() - - // Get next set of dereferenced element type flags. - flags = xunsafe.ReflectPointerElemFlags(flags, rtype) - } - - // Wrap value as TypeIter. - vt := t.Child(rtype, flags) - - // Get value format func. - fn := fmt.loadOrGet(vt) - if fn == nil { - panic("unreachable") - } - - if !needs_typestr(t) { - if n <= 0 { - // No derefs are needed. - return func(s *State) { - if s.P == nil { - // Final check. - appendNil(s) - return - } - - // Format - // final - // value. - fn(s) - } - } - - return func(s *State) { - // Deref n number times. - for i := n; i > 0; i-- { - - if s.P == nil { - // Nil check. - appendNil(s) - return - } - - // Further deref pointer value. - s.P = *(*unsafe.Pointer)(s.P) - } - - if s.P == nil { - // Final check. - appendNil(s) - return - } - - // Format - // final - // value. - fn(s) - } - } - - // Final type string with ptrs. - typestr := typestr_with_ptrs(t) - - if n <= 0 { - // No derefs are needed. - return func(s *State) { - if s.P == nil { - // Final nil value check. - appendNilType(s, typestr) - return - } - - // Format - // final - // value. - fn(s) - } - } - - return func(s *State) { - // Deref n number times. - for i := n; i > 0; i-- { - if s.P == nil { - // Check for nil value. - appendNilType(s, typestr) - return - } - - // Further deref pointer value. - s.P = *(*unsafe.Pointer)(s.P) - } - - if s.P == nil { - // Final nil value check. - appendNilType(s, typestr) - return - } - - // Format - // final - // value. - fn(s) - } -} diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/slice.go b/vendor/codeberg.org/gruf/go-kv/v2/format/slice.go deleted file mode 100644 index e53fc5c4b..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/slice.go +++ /dev/null @@ -1,160 +0,0 @@ -package format - -import "codeberg.org/gruf/go-xunsafe" - -// iterSliceType returns a FormatFunc capable of iterating -// and formatting the given slice type currently in TypeIter{}. -// note this will fetch a sub-FormatFunc for the slice element -// type, and also handle special cases of []byte, []rune slices. -func (fmt *Formatter) iterSliceType(t xunsafe.TypeIter) FormatFunc { - - // Get nested element type. - elem := t.Type.Elem() - esz := elem.Size() - - // Get nested elem TypeIter{} with flags. - flags := xunsafe.ReflectSliceElemFlags(elem) - et := t.Child(elem, flags) - - // Get elem format func. - fn := fmt.loadOrGet(et) - if fn == nil { - panic("unreachable") - } - - if !needs_typestr(t) { - return func(s *State) { - ptr := s.P - - // Get data as unsafe slice header. - hdr := (*xunsafe.Unsafeheader_Slice)(ptr) - if hdr == nil || hdr.Data == nil { - - // Append nil. - appendNil(s) - return - } - - // Prepend array brace. - s.B = append(s.B, '[') - - if hdr.Len > 0 { - for i := 0; i < hdr.Len; i++ { - // Format at array index. - offset := esz * uintptr(i) - s.P = add(hdr.Data, offset) - fn(s) - - // Append separator. - s.B = append(s.B, ',') - } - - // Drop final comma. - s.B = s.B[:len(s.B)-1] - } - - // Append array brace. - s.B = append(s.B, ']') - } - } - - // Slice type string with ptrs / refs. - typestrPtrs := typestr_with_ptrs(t) - typestrRefs := typestr_with_refs(t) - - return func(s *State) { - ptr := s.P - - // Get data as unsafe slice header. - hdr := (*xunsafe.Unsafeheader_Slice)(ptr) - if hdr == nil || hdr.Data == nil { - - // Append nil value with type. - appendNilType(s, typestrPtrs) - return - } - - // Open / close braces. - var open, close uint8 - open, close = '[', ']' - - // Include type info. - if s.A.WithType() { - s.B = append(s.B, typestrRefs...) - open, close = '{', '}' - } - - // Prepend array brace. - s.B = append(s.B, open) - - if hdr.Len > 0 { - for i := 0; i < hdr.Len; i++ { - // Format at array index. - offset := esz * uintptr(i) - s.P = add(hdr.Data, offset) - fn(s) - - // Append separator. - s.B = append(s.B, ',') - } - - // Drop final comma. - s.B = s.B[:len(s.B)-1] - } - - // Append array brace. - s.B = append(s.B, close) - } -} - -func wrapByteSlice(t xunsafe.TypeIter, fn FormatFunc) FormatFunc { - if !needs_typestr(t) { - return func(s *State) { - if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() { - appendString(s, *(*string)(s.P)) - } else { - fn(s) - } - } - } - typestr := typestr_with_ptrs(t) - return func(s *State) { - if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() { - if s.A.WithType() { - s.B = append(s.B, "("+typestr+")("...) - appendString(s, *(*string)(s.P)) - s.B = append(s.B, ")"...) - } else { - appendString(s, *(*string)(s.P)) - } - } else { - fn(s) - } - } -} - -func wrapRuneSlice(t xunsafe.TypeIter, fn FormatFunc) FormatFunc { - if !needs_typestr(t) { - return func(s *State) { - if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() { - appendString(s, string(*(*[]rune)(s.P))) - } else { - fn(s) - } - } - } - typestr := typestr_with_ptrs(t) - return func(s *State) { - if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() { - if s.A.WithType() { - s.B = append(s.B, "("+typestr+")("...) - appendString(s, string(*(*[]rune)(s.P))) - s.B = append(s.B, ")"...) - } else { - appendString(s, string(*(*[]rune)(s.P))) - } - } else { - fn(s) - } - } -} diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/struct.go b/vendor/codeberg.org/gruf/go-kv/v2/format/struct.go deleted file mode 100644 index 617f65d81..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/struct.go +++ /dev/null @@ -1,175 +0,0 @@ -package format - -import "codeberg.org/gruf/go-xunsafe" - -// field stores the minimum necessary -// data for iterating and formatting -// each field in a given struct. -type field struct { - format FormatFunc - name string - offset uintptr -} - -// iterStructType returns a FormatFunc capable of iterating -// and formatting the given struct type currently in TypeIter{}. -// note this will fetch sub-FormatFuncs for each struct field. -func (fmt *Formatter) iterStructType(t xunsafe.TypeIter) FormatFunc { - // Number of struct fields. - n := t.Type.NumField() - - // Gather format functions. - fields := make([]field, n) - for i := 0; i < n; i++ { - - // Get struct field at index. - sfield := t.Type.Field(i) - rtype := sfield.Type - - // Get nested field TypeIter with appropriate flags. - flags := xunsafe.ReflectStructFieldFlags(t.Flag, rtype) - ft := t.Child(sfield.Type, flags) - - // Get field format func. - fn := fmt.loadOrGet(ft) - if fn == nil { - panic("unreachable") - } - - // Set field info. - fields[i] = field{ - format: fn, - name: sfield.Name, - offset: sfield.Offset, - } - } - - // Handle no. fields. - switch len(fields) { - case 0: - return emptyStructType(t) - case 1: - return iterSingleFieldStructType(t, fields[0]) - default: - return iterMultiFieldStructType(t, fields) - } -} - -func emptyStructType(t xunsafe.TypeIter) FormatFunc { - if !needs_typestr(t) { - return func(s *State) { - // Append empty object. - s.B = append(s.B, "{}"...) - } - } - - // Struct type string with refs. - typestr := typestr_with_refs(t) - - // Append empty object - // with type information. - return func(s *State) { - if s.A.WithType() { - s.B = append(s.B, typestr...) - } - s.B = append(s.B, "{}"...) - } -} - -func iterSingleFieldStructType(t xunsafe.TypeIter, field field) FormatFunc { - if field.format == nil { - panic("nil func") - } - - if !needs_typestr(t) { - return func(s *State) { - // Wrap 'fn' with braces + field name. - s.B = append(s.B, "{"+field.name+"="...) - field.format(s) - s.B = append(s.B, "}"...) - } - } - - // Struct type string with refs. - typestr := typestr_with_refs(t) - - return func(s *State) { - // Include type info. - if s.A.WithType() { - s.B = append(s.B, typestr...) - } - - // Wrap 'fn' with braces + field name. - s.B = append(s.B, "{"+field.name+"="...) - field.format(s) - s.B = append(s.B, "}"...) - } -} - -func iterMultiFieldStructType(t xunsafe.TypeIter, fields []field) FormatFunc { - for _, field := range fields { - if field.format == nil { - panic("nil func") - } - } - - if !needs_typestr(t) { - return func(s *State) { - ptr := s.P - - // Prepend object brace. - s.B = append(s.B, '{') - - for i := 0; i < len(fields); i++ { - // Get struct field ptr via offset. - s.P = add(ptr, fields[i].offset) - - // Append field name and value separator. - s.B = append(s.B, fields[i].name+"="...) - - // Format i'th field. - fields[i].format(s) - s.B = append(s.B, ',', ' ') - } - - // Drop final ", ". - s.B = s.B[:len(s.B)-2] - - // Append object brace. - s.B = append(s.B, '}') - } - } - - // Struct type string with refs. - typestr := typestr_with_refs(t) - - return func(s *State) { - ptr := s.P - - // Include type info. - if s.A.WithType() { - s.B = append(s.B, typestr...) - } - - // Prepend object brace. - s.B = append(s.B, '{') - - for i := 0; i < len(fields); i++ { - // Get struct field ptr via offset. - s.P = add(ptr, fields[i].offset) - - // Append field name and value separator. - s.B = append(s.B, fields[i].name+"="...) - - // Format i'th field. - fields[i].format(s) - s.B = append(s.B, ',', ' ') - } - - // Drop final ", ". - s.B = s.B[:len(s.B)-2] - - // Append object brace. - s.B = append(s.B, '}') - } -} diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/type.go b/vendor/codeberg.org/gruf/go-kv/v2/format/type.go deleted file mode 100644 index ce2235c88..000000000 --- a/vendor/codeberg.org/gruf/go-kv/v2/format/type.go +++ /dev/null @@ -1,109 +0,0 @@ -package format - -import ( - "reflect" - "strings" - - "codeberg.org/gruf/go-xunsafe" -) - -// visit ... -func visit(iter xunsafe.TypeIter) bool { - t := iter.Type - - // Check if type is already encountered further up tree. - for node := iter.Parent; node != nil; node = node.Parent { - if node.Type == t { - return false - } - } - - return true -} - -// needs_typestr returns whether the type contained in the -// receiving TypeIter{} needs type string information prefixed -// when the TypeMask argument flag bit is set. Certain types -// don't need this as the parent type already indicates this. -func needs_typestr(iter xunsafe.TypeIter) bool { - if iter.Parent == nil { - return true - } - switch p := iter.Parent.Type; p.Kind() { - case reflect.Pointer: - return needs_typestr(*iter.Parent) - case reflect.Slice, - reflect.Array, - reflect.Map: - return false - default: - return true - } -} - -// typestr_with_ptrs returns the type string for -// current xunsafe.TypeIter{} with asterisks for pointers. -func typestr_with_ptrs(iter xunsafe.TypeIter) string { - t := iter.Type - - // Check for parent. - if iter.Parent == nil { - return t.String() - } - - // Get parent type. - p := iter.Parent.Type - - // If parent is not ptr, then - // this was not a deref'd ptr. - if p.Kind() != reflect.Pointer { - return t.String() - } - - // Return un-deref'd - // ptr (parent) type. - return p.String() -} - -// typestr_with_refs returns the type string for -// current xunsafe.TypeIter{} with ampersands for pointers. -func typestr_with_refs(iter xunsafe.TypeIter) string { - t := iter.Type - - // Check for parent. - if iter.Parent == nil { - return t.String() - } - - // Get parent type. - p := iter.Parent.Type - - var d int - - // Count number of dereferences. - for p.Kind() == reflect.Pointer { - p = p.Elem() - d++ - } - - if d <= 0 { - // Prefer just returning our - // own string if possible, to - // reduce number of strings - // we need to allocate. - return t.String() - } - - // Value type str. - str := t.String() - - // Return with type ptrs - // symbolized by 'refs'. - var buf strings.Builder - buf.Grow(len(str) + d) - for i := 0; i < d; i++ { - buf.WriteByte('&') - } - buf.WriteString(str) - return buf.String() -} |
