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

refactor

parent d12334a6
No related branches found
No related tags found
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