Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 13 additions & 8 deletions filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,27 @@ func (fn MatcherFunc) Match(event Event) bool {
return fn(event)
}

// Filter provides an event sink that sends only events that are accepted by a
// Matcher. No methods on filter are goroutine safe.
type Filter struct {
// Filter is the concrete implementation returned by [NewFilter].
//
// Deprecated: Filter should not be constructed directly. Use [NewFilter] instead.
type Filter = filter

type filter struct {
dst Sink
matcher Matcher
closed bool
}

// NewFilter returns a new filter that will send to events to dst that return
// true for Matcher.
// NewFilter returns a new event sink that forwards only events accepted by
// matcher to dst.
//
// The returned Sink's methods are not safe for concurrent use.
func NewFilter(dst Sink, matcher Matcher) Sink {
return &Filter{dst: dst, matcher: matcher}
return &filter{dst: dst, matcher: matcher}
}

// Write an event to the filter.
func (f *Filter) Write(event Event) error {
func (f *filter) Write(event Event) error {
if f.closed {
return ErrSinkClosed
}
Expand All @@ -41,7 +46,7 @@ func (f *Filter) Write(event Event) error {
}

// Close the filter and allow no more events to pass through.
func (f *Filter) Close() error {
func (f *filter) Close() error {
// TODO(stevvooe): Not all sinks should have Close.
if f.closed {
return nil
Expand Down
6 changes: 3 additions & 3 deletions filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ import "testing"
func TestFilter(t *testing.T) {
const nevents = 100
ts := newTestSink(t, nevents/2)
filter := NewFilter(ts, MatcherFunc(func(event Event) bool {
f := NewFilter(ts, MatcherFunc(func(event Event) bool {
i, ok := event.(int)
return ok && i%2 == 0
}))

for i := range nevents {
if err := filter.Write(i); err != nil {
if err := f.Write(i); err != nil {
t.Fatalf("unexpected error writing event: %v", err)
}
}

checkClose(t, filter)
checkClose(t, f)
}
Loading