From b53c1a71d76a9e9b38eb6bc50247f16534c3f703 Mon Sep 17 00:00:00 2001
From: "a.petraki" <a.petraki@perx.ru>
Date: Mon, 19 Feb 2024 22:25:10 +0300
Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?=
 =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 zap/channels.go         | 33 ++++++++++++++++++---------------
 zap/channels_test.go    | 30 +++++++++++++-----------------
 zap/field.go            |  2 +-
 zap/filter_core.go      |  8 ++++----
 zap/filter_core_test.go |  4 ++--
 5 files changed, 38 insertions(+), 39 deletions(-)

diff --git a/zap/channels.go b/zap/channels.go
index 33451c3a..21467d40 100644
--- a/zap/channels.go
+++ b/zap/channels.go
@@ -3,6 +3,7 @@ package zap
 import (
 	"strings"
 
+	"git.perx.ru/perxis/perxis-go/pkg/data"
 	"go.uber.org/zap/zapcore"
 )
 
@@ -10,13 +11,13 @@ const (
 	channelKey = "channel"
 )
 
-func HasChannel(channel string) FilterFunc {
+func ContainsChannels(channels ...string) FilterFunc {
 	return func(entry zapcore.Entry, fields []zapcore.Field) bool {
 		for _, f := range fields {
 			if f.Key == channelKey && f.Type == zapcore.StringType {
 				list := strings.Split(f.String, ",")
 				for _, v := range list {
-					if v == channel {
+					if data.Contains(v, channels) {
 						return true
 					}
 				}
@@ -26,22 +27,24 @@ func HasChannel(channel string) FilterFunc {
 	}
 }
 
-// NewDefaultChannelCore аналогичен NewChannelCore, но также устанавливает переданный канал в качестве канала по умолчанию.
-// Это означает, что если поле Channel в записи не указано, запись все равно будет передана в zapcore.Core.
-func NewDefaultChannelCore(core zapcore.Core, channel string) zapcore.Core {
-	return NewChannelCore(core, channel, true)
+// WithDefaultChannel аналогичен WithChannel, но также устанавливает переданный канал в качестве канала по умолчанию.
+// Это означает, что если поле Channels в записи не указано, запись все равно будет передана в zapcore.Core.
+func WithDefaultChannel(core zapcore.Core, channel string) zapcore.Core {
+	return WithChannel(core, channel, true)
 }
 
-// NewChannelCore добавляет к переданному Core фильтрацию записей по каналам.
-// Это означает, что если запись содержит поле Channel и значение соответствует
+// WithChannel добавляет к переданному Core фильтрацию записей по каналам.
+// Это означает, что если запись содержит поле Channels и значение соответствует
 // переданному каналу, то запись будет передана в zapcore.Core.
-func NewChannelCore(core zapcore.Core, channel string, isDefault ...bool) zapcore.Core {
-	filterFn := HasChannel(channel)
+func WithChannel(core zapcore.Core, channel string, isDefault ...bool) zapcore.Core {
+	filterFn := ContainsChannels(channel)
 	if len(isDefault) > 0 && isDefault[0] {
-		filterFn = Or(
-			HasChannel(channel),
-			Not(ContainsKey(channelKey)),
-		)
+		filterFn = Or(filterFn, Not(ContainsKey(channelKey)))
 	}
-	return RegisterFilters(core, filterFn)
+	return WithFilters(core, filterFn)
+}
+
+func WithChannels(core zapcore.Core, channels ...string) zapcore.Core {
+	filterFn := ContainsChannels(channels...)
+	return WithFilters(core, filterFn)
 }
diff --git a/zap/channels_test.go b/zap/channels_test.go
index 51fa2907..ba1a70eb 100644
--- a/zap/channels_test.go
+++ b/zap/channels_test.go
@@ -10,12 +10,12 @@ import (
 
 func TestNewChannelCore_WriteSingleChannel(t *testing.T) {
 	core, logs := observer.New(zapcore.InfoLevel)
-	core = NewChannelCore(core, "test")
+	core = WithChannel(core, "test")
 
-	err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channel("test")})
+	err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channels("test")})
 	require.NoError(t, err)
 
-	err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channel("empty")}) // запись не попадет в лог
+	err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channels("empty")}) // запись не попадет в лог
 	require.NoError(t, err)
 
 	require.Equal(t, 1, logs.Len())
@@ -25,29 +25,25 @@ func TestNewChannelCore_WriteMultiplyChannels(t *testing.T) {
 	core, logs := observer.New(zapcore.InfoLevel)
 
 	core = zapcore.NewTee(
-		NewChannelCore(core, "test1"),
-		NewChannelCore(core, "test2"),
+		WithChannel(core, "test1"),
+		WithChannel(core, "test2"),
 	)
 
-	err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channel("test1", "test2")}) // запись попадет сразу в 2 core
-	require.NoError(t, err)
-
+	require.NoError(t, core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channels("test1", "test2")})) // запись попадет сразу в 2 core
 	require.Equal(t, 2, logs.Len())
 }
 
 func TestNewDefaultChannelCore(t *testing.T) {
 	core, logs := observer.New(zapcore.InfoLevel)
 
-	core = NewDefaultChannelCore(core, "test1")
-
-	err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channel("test1")})
-	require.NoError(t, err)
-
-	err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channel("test2")}) // эта запись не попадет в лог
-	require.NoError(t, err)
+	core = zapcore.NewTee(
+		WithChannel(core, "test1", true),
+		WithChannel(core, "test2"),
+	)
 
-	err = core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{})
-	require.NoError(t, err)
+	require.NoError(t, core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channels("test1")}))
+	require.NoError(t, core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{Channels("test3")})) // эта запись не попадет в лог
+	require.NoError(t, core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{}))
 
 	require.Equal(t, 2, logs.Len())
 }
diff --git a/zap/field.go b/zap/field.go
index 258753d6..a0c56f71 100644
--- a/zap/field.go
+++ b/zap/field.go
@@ -10,7 +10,7 @@ import (
 	"go.uber.org/zap"
 )
 
-func Channel(channels ...string) zap.Field {
+func Channels(channels ...string) zap.Field {
 	return zap.String(channelKey, strings.Join(channels, ","))
 }
 
diff --git a/zap/filter_core.go b/zap/filter_core.go
index 16888f58..7e99d942 100644
--- a/zap/filter_core.go
+++ b/zap/filter_core.go
@@ -56,20 +56,20 @@ type filterCore struct {
 	fields []zap.Field
 }
 
-// RegisterFilters - добавить фильтры, которые будут применяться при записи лога (вызове `core.Write`)
+// WithFilters - добавить фильтры, которые будут применяться при записи лога (вызове `core.Write`)
 // Метод `core.Write` будет вызван только в случае, когда результат всех фильтров `true`
 //
 // Обратить внимание, фильтр не применяется к полям, которые были добавлены в `core` через вызов `core.With`
-// до вызова RegisterFilters. Пример:
+// до вызова WithFilters. Пример:
 //
 //	l, _ := zap.NewDevelopment()
 //	core := l.Core().With([]zapcore.Field{zap.Int("a", 5)})
-//	core = RegisterFilters(core, ContainsField(zap.Int("a", 5)))
+//	core = WithFilters(core, ContainsField(zap.Int("a", 5)))
 //
 //	logger := zap.New(core)
 //	logger.Info("Test log") // НЕ будет записан
 //	logger.Info("Test log", zap.Int("a", 5)) // будет записан
-func RegisterFilters(core zapcore.Core, filters ...FilterFunc) zapcore.Core {
+func WithFilters(core zapcore.Core, filters ...FilterFunc) zapcore.Core {
 	return &filterCore{
 		Core:    core,
 		filters: filters,
diff --git a/zap/filter_core_test.go b/zap/filter_core_test.go
index 6684be5f..21c906f2 100644
--- a/zap/filter_core_test.go
+++ b/zap/filter_core_test.go
@@ -11,7 +11,7 @@ import (
 
 func TestFilterCore_Write(t *testing.T) {
 	core, logs := observer.New(zapcore.InfoLevel)
-	core = RegisterFilters(core, ContainsField(zap.Bool("check", true)))
+	core = WithFilters(core, ContainsField(zap.Bool("check", true)))
 
 	err := core.With([]zapcore.Field{zap.Bool("check", true)}).Write(zapcore.Entry{Message: "msg"}, nil)
 	require.NoError(t, err)
@@ -27,7 +27,7 @@ func TestFilterCore_Write(t *testing.T) {
 
 func TestNotContainsField(t *testing.T) {
 	core, logs := observer.New(zapcore.InfoLevel)
-	core = RegisterFilters(core, Not(ContainsField(zap.Int("b", 2))))
+	core = WithFilters(core, Not(ContainsField(zap.Int("b", 2))))
 
 	err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
 		zap.Int("a", 1),
-- 
GitLab