Skip to content
Snippets Groups Projects
Commit 4be72d59 authored by Semyon Krestyaninov's avatar Semyon Krestyaninov
Browse files

refactor

parent d12334a6
Branches
Tags
No related merge requests found
...@@ -7,8 +7,8 @@ import ( ...@@ -7,8 +7,8 @@ import (
type FilterFunc func(entry zapcore.Entry, fields []zapcore.Field) bool type FilterFunc func(entry zapcore.Entry, fields []zapcore.Field) bool
func FilterField(field zapcore.Field) FilterFunc { func HasField(field zapcore.Field) FilterFunc {
return func(entry zapcore.Entry, fields []zapcore.Field) bool { return func(_ zapcore.Entry, fields []zapcore.Field) bool {
for _, f := range fields { for _, f := range fields {
if f.Equals(field) { if f.Equals(field) {
return true return true
...@@ -18,24 +18,52 @@ func FilterField(field zapcore.Field) FilterFunc { ...@@ -18,24 +18,52 @@ func FilterField(field zapcore.Field) FilterFunc {
} }
} }
func Or(filters ...FilterFunc) FilterFunc {
return func(entry zapcore.Entry, fields []zapcore.Field) bool {
for _, filter := range filters {
if filter(entry, fields) {
return true
}
}
return false
}
}
func And(filters ...FilterFunc) FilterFunc {
return func(entry zapcore.Entry, fields []zapcore.Field) bool {
for _, filter := range filters {
if !filter(entry, fields) {
return false
}
}
return true
}
}
func Not(filter FilterFunc) FilterFunc {
return func(entry zapcore.Entry, fields []zapcore.Field) bool {
return !filter(entry, fields)
}
}
type filterCore struct { type filterCore struct {
zapcore.Core zapcore.Core
filters []FilterFunc filter FilterFunc
fields []zap.Field fields []zap.Field
} }
func RegisterFilters(core zapcore.Core, filters ...FilterFunc) zapcore.Core { func RegisterFilters(core zapcore.Core, filter FilterFunc) zapcore.Core {
return &filterCore{ return &filterCore{
Core: core, Core: core,
filters: filters, filter: filter,
} }
} }
func (core *filterCore) With(fields []zapcore.Field) zapcore.Core { func (core *filterCore) With(fields []zapcore.Field) zapcore.Core {
return &filterCore{ return &filterCore{
Core: core.Core.With(fields), Core: core.Core.With(fields),
filters: core.filters, filter: core.filter,
fields: append(core.fields, fields...), fields: append(core.fields, fields...),
} }
} }
...@@ -48,15 +76,13 @@ func (core *filterCore) Check(entry zapcore.Entry, checkedEntry *zapcore.Checked ...@@ -48,15 +76,13 @@ func (core *filterCore) Check(entry zapcore.Entry, checkedEntry *zapcore.Checked
} }
func (core *filterCore) Write(entry zapcore.Entry, fields []zapcore.Field) error { func (core *filterCore) Write(entry zapcore.Entry, fields []zapcore.Field) error {
if len(core.filters) > 0 { if len(core.fields) > 0 {
fields = append(core.fields, fields...) fields = append(core.fields, fields...)
} }
for _, filter := range core.filters { if !core.filter(entry, fields) {
if !filter(entry, fields) {
return nil return nil
} }
}
return core.Core.Write(entry, fields) return core.Core.Write(entry, fields)
} }
...@@ -11,7 +11,7 @@ import ( ...@@ -11,7 +11,7 @@ import (
func TestFilterCore_Write(t *testing.T) { func TestFilterCore_Write(t *testing.T) {
core, logs := observer.New(zapcore.InfoLevel) core, logs := observer.New(zapcore.InfoLevel)
core = RegisterFilters(core, FilterField(zap.Bool("check", true))) core = RegisterFilters(core, HasField(zap.Bool("check", true)))
err := core.With([]zapcore.Field{zap.Bool("check", true)}).Write(zapcore.Entry{Message: "msg"}, nil) err := core.With([]zapcore.Field{zap.Bool("check", true)}).Write(zapcore.Entry{Message: "msg"}, nil)
require.NoError(t, err) require.NoError(t, err)
...@@ -24,3 +24,64 @@ func TestFilterCore_Write(t *testing.T) { ...@@ -24,3 +24,64 @@ func TestFilterCore_Write(t *testing.T) {
require.Equal(t, 2, logs.Len()) require.Equal(t, 2, logs.Len())
} }
func TestAnd(t *testing.T) {
core, logs := observer.New(zapcore.InfoLevel)
core = RegisterFilters(core, And(
HasField(zap.Int("a", 1)),
HasField(zap.Int("b", 2)),
))
err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
zap.Int("a", 1),
zap.Int("b", 2),
})
require.NoError(t, err)
err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
zap.Int("a", 1),
zap.Int("b", 3),
})
require.NoError(t, err)
require.Equal(t, 1, logs.Len())
}
func TestOr(t *testing.T) {
core, logs := observer.New(zapcore.InfoLevel)
core = RegisterFilters(core, Or(
HasField(zap.Int("a", 1)),
HasField(zap.Int("b", 2)),
))
err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
zap.Int("a", 1),
zap.Int("b", 3),
})
require.NoError(t, err)
err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
zap.Int("a", 3),
zap.Int("b", 2),
})
require.NoError(t, err)
require.Equal(t, 2, logs.Len())
}
func TestNot(t *testing.T) {
core, logs := observer.New(zapcore.InfoLevel)
core = RegisterFilters(core, Not(HasField(zap.Int("a", 1))))
err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
zap.Int("a", 1),
})
require.NoError(t, err)
err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
zap.Int("a", 2),
})
require.NoError(t, err)
require.Equal(t, 1, logs.Len())
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment