47 lines
824 B
Go
47 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)
|
|
}
|