event: minor additions used when updating gopls

Added an Error helper that is a Log that also takes an error.
Added a Find method that searches an event for a named label.

Change-Id: Ie4d7deb669140ae5699e45765823b4ef7ffd3c05
Reviewed-on: https://go-review.googlesource.com/c/exp/+/333069
Trust: Ian Cottrell <iancottrell@google.com>
Run-TryBot: Ian Cottrell <iancottrell@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/event/common.go b/event/common.go
index 68c0008..e98d20b 100644
--- a/event/common.go
+++ b/event/common.go
@@ -49,6 +49,15 @@
 	}
 }
 
+func Error(ctx context.Context, msg string, err error, labels ...Label) {
+	ev := New(ctx, LogKind)
+	if ev != nil {
+		ev.Labels = append(ev.Labels, labels...)
+		ev.Labels = append(ev.Labels, String("msg", msg), Value("error", err))
+		ev.Deliver()
+	}
+}
+
 func Annotate(ctx context.Context, labels ...Label) {
 	ev := New(ctx, 0)
 	if ev != nil {
diff --git a/event/event.go b/event/event.go
index bfba077..beff412 100644
--- a/event/event.go
+++ b/event/event.go
@@ -118,3 +118,12 @@
 	eventPool.Put(ev)
 	return ctx
 }
+
+func (ev *Event) Find(name string) Label {
+	for _, l := range ev.Labels {
+		if l.Name == name {
+			return l
+		}
+	}
+	return Label{}
+}
diff --git a/event/keys/keys.go b/event/keys/keys.go
index a4463fb..b9b7a44 100644
--- a/event/keys/keys.go
+++ b/event/keys/keys.go
@@ -185,3 +185,14 @@
 
 // From can be used to get a value from a Label.
 func (k Bool) From(l event.Label) bool { return l.Bool() }
+
+// Error represents a key
+type Error string
+
+// Of creates a new Label with this key and the supplied value.
+func (k Error) Of(v error) event.Label {
+	return event.Value(string(k), v)
+}
+
+// From can be used to get a value from a Label.
+func (k Error) From(l event.Label) error { return l.Interface().(error) }
diff --git a/jsonrpc2/conn.go b/jsonrpc2/conn.go
index f7ddaa1..b4befbf 100644
--- a/jsonrpc2/conn.go
+++ b/jsonrpc2/conn.go
@@ -414,7 +414,7 @@
 	if err := c.respond(entry, result, rerr); err != nil {
 		// no way to propagate this error
 		//TODO: should we do more than just log it?
-		event.Log(entry.baseCtx, "jsonrpc2 message delivery failed", event.Value("error", err))
+		event.Error(entry.baseCtx, "jsonrpc2 message delivery failed", err)
 	}
 }