summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-mangler/init.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/codeberg.org/gruf/go-mangler/init.go')
-rw-r--r--vendor/codeberg.org/gruf/go-mangler/init.go119
1 files changed, 119 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-mangler/init.go b/vendor/codeberg.org/gruf/go-mangler/init.go
new file mode 100644
index 000000000..2c20e6761
--- /dev/null
+++ b/vendor/codeberg.org/gruf/go-mangler/init.go
@@ -0,0 +1,119 @@
+package mangler
+
+import (
+ "net"
+ "net/netip"
+ "net/url"
+ "reflect"
+ "time"
+ _ "unsafe"
+)
+
+func init() {
+ // Register standard library performant manglers.
+ Register(reflect.TypeOf(net.IPAddr{}), mangle_ipaddr)
+ Register(reflect.TypeOf(&net.IPAddr{}), mangle_ipaddr_ptr)
+ Register(reflect.TypeOf(netip.Addr{}), mangle_addr)
+ Register(reflect.TypeOf(&netip.Addr{}), mangle_addr_ptr)
+ Register(reflect.TypeOf(netip.AddrPort{}), mangle_addrport)
+ Register(reflect.TypeOf(&netip.AddrPort{}), mangle_addrport_ptr)
+ Register(reflect.TypeOf(time.Time{}), mangle_time)
+ Register(reflect.TypeOf(&time.Time{}), mangle_time_ptr)
+ Register(reflect.TypeOf(url.URL{}), mangle_url)
+ Register(reflect.TypeOf(&url.URL{}), mangle_url_ptr)
+}
+
+//go:linkname time_sec time.(*Time).sec
+func time_sec(*time.Time) int64
+
+//go:linkname time_nsec time.(*Time).nsec
+func time_nsec(*time.Time) int32
+
+//go:linkname time_stripMono time.(*Time).stripMono
+func time_stripMono(*time.Time)
+
+func mangle_url(buf []byte, a any) []byte {
+ u := (*url.URL)(iface_value(a))
+ return append(buf, u.String()...)
+}
+
+func mangle_url_ptr(buf []byte, a any) []byte {
+ if ptr := (*url.URL)(iface_value(a)); ptr != nil {
+ s := ptr.String()
+ buf = append(buf, '1')
+ return append(buf, s...)
+ }
+ buf = append(buf, '0')
+ return buf
+}
+
+func mangle_time(buf []byte, a any) []byte {
+ t := *(*time.Time)(iface_value(a))
+ time_stripMono(&t) // force non-monotonic time value.
+ buf = append_uint64(buf, uint64(time_sec(&t)))
+ buf = append_uint32(buf, uint32(time_nsec(&t)))
+ return buf
+}
+
+func mangle_time_ptr(buf []byte, a any) []byte {
+ if ptr := (*time.Time)(iface_value(a)); ptr != nil {
+ t := *ptr
+ buf = append(buf, '1')
+ time_stripMono(&t) // force non-monotonic time value.
+ buf = append_uint64(buf, uint64(time_sec(&t)))
+ buf = append_uint32(buf, uint32(time_nsec(&t)))
+ return buf
+ }
+ buf = append(buf, '0')
+ return buf
+}
+
+func mangle_ipaddr(buf []byte, a any) []byte {
+ i := *(*net.IPAddr)(iface_value(a))
+ buf = append(buf, i.IP...)
+ buf = append(buf, i.Zone...)
+ return buf
+}
+
+func mangle_ipaddr_ptr(buf []byte, a any) []byte {
+ if ptr := (*net.IPAddr)(iface_value(a)); ptr != nil {
+ buf = append(buf, '1')
+ buf = append(buf, ptr.IP...)
+ buf = append(buf, ptr.Zone...)
+ return buf
+ }
+ buf = append(buf, '0')
+ return buf
+}
+
+func mangle_addr(buf []byte, a any) []byte {
+ i := (*netip.Addr)(iface_value(a))
+ b, _ := i.MarshalBinary()
+ return append(buf, b...)
+}
+
+func mangle_addr_ptr(buf []byte, a any) []byte {
+ if ptr := (*netip.Addr)(iface_value(a)); ptr != nil {
+ buf = append(buf, '1')
+ b, _ := ptr.MarshalBinary()
+ return append(buf, b...)
+ }
+ buf = append(buf, '0')
+ return buf
+}
+
+func mangle_addrport(buf []byte, a any) []byte {
+ i := (*netip.AddrPort)(iface_value(a))
+ b, _ := i.MarshalBinary()
+ return append(buf, b...)
+}
+
+func mangle_addrport_ptr(buf []byte, a any) []byte {
+ if ptr := (*netip.AddrPort)(iface_value(a)); ptr != nil {
+ buf = append(buf, '1')
+ b, _ := ptr.MarshalBinary()
+ return append(buf, b...)
+ }
+ buf = append(buf, '0')
+ return buf
+}