1package events
2
3// Matcher matches events.
4type Matcher interface {
5	Match(event Event) bool
6}
7
8// MatcherFunc implements matcher with just a function.
9type MatcherFunc func(event Event) bool
10
11// Match calls the wrapped function.
12func (fn MatcherFunc) Match(event Event) bool {
13	return fn(event)
14}
15
16// Filter provides an event sink that sends only events that are accepted by a
17// Matcher. No methods on filter are goroutine safe.
18type Filter struct {
19	dst     Sink
20	matcher Matcher
21	closed  bool
22}
23
24// NewFilter returns a new filter that will send to events to dst that return
25// true for Matcher.
26func NewFilter(dst Sink, matcher Matcher) Sink {
27	return &Filter{dst: dst, matcher: matcher}
28}
29
30// Write an event to the filter.
31func (f *Filter) Write(event Event) error {
32	if f.closed {
33		return ErrSinkClosed
34	}
35
36	if f.matcher.Match(event) {
37		return f.dst.Write(event)
38	}
39
40	return nil
41}
42
43// Close the filter and allow no more events to pass through.
44func (f *Filter) Close() error {
45	// TODO(stevvooe): Not all sinks should have Close.
46	if f.closed {
47		return nil
48	}
49
50	f.closed = true
51	return f.dst.Close()
52}
53