Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / mvdan.cc / gofumpt@v0.0.0-20200802201014-ab5a8192947d / gofumports / internal / event / core / event.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/mvdan.cc/gofumpt@v0.0.0-20200802201014-ab5a8192947d/gofumports/internal/event/core/event.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/mvdan.cc/gofumpt@v0.0.0-20200802201014-ab5a8192947d/gofumports/internal/event/core/event.go
new file mode 100644 (file)
index 0000000..cfe89c7
--- /dev/null
@@ -0,0 +1,85 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package core provides support for event based telemetry.
+package core
+
+import (
+       "fmt"
+       "time"
+
+       "mvdan.cc/gofumpt/gofumports/internal/event/label"
+)
+
+// Event holds the information about an event of note that ocurred.
+type Event struct {
+       at time.Time
+
+       // As events are often on the stack, storing the first few labels directly
+       // in the event can avoid an allocation at all for the very common cases of
+       // simple events.
+       // The length needs to be large enough to cope with the majority of events
+       // but no so large as to cause undue stack pressure.
+       // A log message with two values will use 3 labels (one for each value and
+       // one for the message itself).
+
+       static  [3]label.Label // inline storage for the first few labels
+       dynamic []label.Label  // dynamically sized storage for remaining labels
+}
+
+// eventLabelMap implements label.Map for a the labels of an Event.
+type eventLabelMap struct {
+       event Event
+}
+
+func (ev Event) At() time.Time { return ev.at }
+
+func (ev Event) Format(f fmt.State, r rune) {
+       if !ev.at.IsZero() {
+               fmt.Fprint(f, ev.at.Format("2006/01/02 15:04:05 "))
+       }
+       for index := 0; ev.Valid(index); index++ {
+               if l := ev.Label(index); l.Valid() {
+                       fmt.Fprintf(f, "\n\t%v", l)
+               }
+       }
+}
+
+func (ev Event) Valid(index int) bool {
+       return index >= 0 && index < len(ev.static)+len(ev.dynamic)
+}
+
+func (ev Event) Label(index int) label.Label {
+       if index < len(ev.static) {
+               return ev.static[index]
+       }
+       return ev.dynamic[index-len(ev.static)]
+}
+
+func (ev Event) Find(key label.Key) label.Label {
+       for _, l := range ev.static {
+               if l.Key() == key {
+                       return l
+               }
+       }
+       for _, l := range ev.dynamic {
+               if l.Key() == key {
+                       return l
+               }
+       }
+       return label.Label{}
+}
+
+func MakeEvent(static [3]label.Label, labels []label.Label) Event {
+       return Event{
+               static:  static,
+               dynamic: labels,
+       }
+}
+
+// CloneEvent event returns a copy of the event with the time adjusted to at.
+func CloneEvent(ev Event, at time.Time) Event {
+       ev.at = at
+       return ev
+}