buf.WriteByte(' ')
buf.WriteString("msg=")
buf.WriteString(r.Message)
- r.Attrs(func(a slog.Attr) {
+ r.Attrs(func(a slog.Attr) bool {
buf.WriteByte(' ')
buf.WriteString(a.Key)
buf.WriteByte('=')
h.appendValue(buf, a.Value)
+ return true
})
buf.WriteByte('\n')
_, err := h.w.Write(*buf)
}
// Attrs calls f on each Attr in the Record.
+// Iteration stops if f returns false.
// The Attrs are already resolved.
-func (r Record) Attrs(f func(Attr)) {
+func (r Record) Attrs(f func(Attr) bool) {
for i := 0; i < r.nFront; i++ {
- f(r.front[i])
+ if !f(r.front[i]) {
+ return
+ }
}
for _, a := range r.back {
- f(a)
+ if !f(a) {
+ return
+ }
}
}
if got := attrsSlice(r); !attrsEqual(got, as) {
t.Errorf("got %v, want %v", got, as)
}
+
+ // Early return.
+ var got []Attr
+ r.Attrs(func(a Attr) bool {
+ got = append(got, a)
+ return len(got) < 2
+ })
+ want := as[:2]
+ if !attrsEqual(got, want) {
+ t.Errorf("got %v, want %v", got, want)
+ }
}
func TestRecordSourceLine(t *testing.T) {
func attrsSlice(r Record) []Attr {
s := make([]Attr, 0, r.NumAttrs())
- r.Attrs(func(a Attr) { s = append(s, a) })
+ r.Attrs(func(a Attr) bool { s = append(s, a); return true })
return s
}
for j := 0; j < nAttrs; j++ {
r.AddAttrs(Int("k", j))
}
- r.Attrs(func(b Attr) { a = b })
+ r.Attrs(func(b Attr) bool { a = b; return true })
}
_ = a
}