48 lines
824 B
Go
48 lines
824 B
Go
|
package audit
|
||
|
|
||
|
type WriterSinkOption func(sink *writerCloserSink)
|
||
|
|
||
|
var (
|
||
|
WithCloseOnExit WriterSinkOption = func(sink *writerCloserSink) {
|
||
|
sink.closeOnExit = true
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func NewWriterSink(name string, target Writer, opts ...WriterSinkOption) Sink {
|
||
|
sink := &writerCloserSink{
|
||
|
name: name,
|
||
|
target: target,
|
||
|
}
|
||
|
|
||
|
for _, opt := range opts {
|
||
|
opt(sink)
|
||
|
}
|
||
|
|
||
|
return sink
|
||
|
}
|
||
|
|
||
|
type writerCloserSink struct {
|
||
|
name string
|
||
|
target Writer
|
||
|
closeOnExit bool
|
||
|
}
|
||
|
|
||
|
type syncer interface {
|
||
|
Sync() error
|
||
|
}
|
||
|
|
||
|
func (f writerCloserSink) Name() string {
|
||
|
return f.name
|
||
|
}
|
||
|
|
||
|
func (f writerCloserSink) OnSubscribe(evs <-chan Event) {
|
||
|
go func(target Writer, closeOnExit bool, evs <-chan Event) {
|
||
|
for ev := range evs {
|
||
|
_ = target.Write(&ev)
|
||
|
}
|
||
|
if closeOnExit {
|
||
|
_ = target.Close()
|
||
|
}
|
||
|
}(f.target, f.closeOnExit, evs)
|
||
|
}
|