Skip to content

Commit c92baed

Browse files
authored
Merge pull request #1 from panapol-p/feat/add-data-into-event-struct
feat(core): add data into event struct
2 parents 7b62c84 + b4c3937 commit c92baed

File tree

4 files changed

+66
-46
lines changed

4 files changed

+66
-46
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ package main
1212
import (
1313
"fmt"
1414

15-
listener "go-slice-struct-listener"
15+
listener "github.com/panapol-p/go-slice-struct-listener"
1616
)
1717

1818
type FeedData struct {
@@ -30,27 +30,27 @@ func main() {
3030
l := listener.NewListener[FeedData]()
3131

3232
// set callback func if you need
33-
f := func(e []listener.Events) {
33+
f := func(e []listener.Events[FeedData]) {
3434
fmt.Println("[callback func]", "receive new event!!", e)
3535
}
3636
l.SetCallback(f)
3737

3838
events := l.AddNewValue(fs)
39-
fmt.Println(events) // [{added 1} {added 2}]
39+
fmt.Println(events) // [{1 added {1 Bob 98.5}} {2 added {2 Joe 92.5}}]
4040

4141
fs = []FeedData{
4242
{ID: "1", Name: "Bob", Score: 96.50},
4343
{ID: "2", Name: "Joe", Score: 92.50},
4444
{ID: "3", Name: "Micky", Score: 89.70},
4545
}
4646
events = l.AddNewValue(fs)
47-
fmt.Println(events) // [{updated 1} {added 3}]
47+
fmt.Println(events) // [{1 updated {1 Bob 96.5}} {3 added {3 Micky 89.7}}]
4848

4949
fs = []FeedData{
5050
{ID: "1", Name: "Bob", Score: 96.50},
5151
}
5252
events = l.AddNewValue(fs)
53-
fmt.Println(events) // [{deleted 2} {deleted 3}]
53+
fmt.Println(events) // [{2 deleted { 0}} {3 deleted { 0}}]
5454
}
5555
```
5656

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module go-slice-struct-listener
1+
module github.com/panapol-p/go-slice-struct-listener
22

33
go 1.19
44

listener.go

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,49 @@ import (
77
)
88

99
type Listener[T any] struct {
10-
CurrentValue map[string]string
11-
NewValue map[string]string
12-
EventCallback func([]Events)
13-
CurrentEvent []Events
10+
CurrentValue map[string]Value[T]
11+
NewValue map[string]Value[T]
12+
EventCallback func([]Events[T])
13+
CurrentEvent []Events[T]
1414
mu sync.Mutex
1515
}
1616

1717
type EventState string
1818

1919
type DataStruct interface{}
20+
type Value[T any] struct {
21+
Hash string
22+
Data T
23+
}
2024

2125
var EventStateAdded EventState = "added"
2226
var EventStateUpdated EventState = "updated"
2327
var EventStateDeleted EventState = "deleted"
2428

25-
type Events struct {
26-
State EventState
29+
type Events[T any] struct {
2730
ID string
31+
State EventState
32+
Data T
2833
}
2934

3035
func NewListener[T any]() *Listener[T] {
3136
return &Listener[T]{}
3237
}
3338

34-
func (l *Listener[T]) SetCallback(f func([]Events)) {
39+
func (l *Listener[T]) SetCallback(f func([]Events[T])) {
3540
l.EventCallback = f
3641
}
3742

38-
func (l *Listener[T]) AddNewValue(a []T) []Events {
43+
func (l *Listener[T]) AddNewValue(a []T) []Events[T] {
3944
l.mu.Lock()
4045
defer l.mu.Unlock()
4146

4247
l.NewValue = l.convertToMap(a)
4348
return l.compareMap()
4449
}
4550

46-
func (l *Listener[T]) convertToMap(s []T) map[string]string {
47-
m := make(map[string]string)
51+
func (l *Listener[T]) convertToMap(s []T) map[string]Value[T] {
52+
m := make(map[string]Value[T])
4853

4954
var uniqueField []string
5055
for ii := range s {
@@ -68,31 +73,36 @@ func (l *Listener[T]) convertToMap(s []T) map[string]string {
6873
}
6974

7075
b, _ := json.Marshal(s[ii])
71-
m[uniqueID] = string(b)
76+
m[uniqueID] = Value[T]{
77+
Hash: string(b),
78+
Data: s[ii],
79+
}
7280
}
7381
return m
7482
}
7583

76-
func (l *Listener[T]) compareMap() []Events {
77-
var es []Events
84+
func (l *Listener[T]) compareMap() []Events[T] {
85+
var es []Events[T]
7886

7987
for key := range l.NewValue {
80-
var e Events
88+
var e Events[T]
8189
if value, ok := l.CurrentValue[key]; ok {
82-
if value != l.NewValue[key] {
90+
if value.Hash != l.NewValue[key].Hash {
8391
e.ID = key
8492
e.State = EventStateUpdated
93+
e.Data = l.NewValue[key].Data
8594
es = append(es, e)
8695
}
8796
} else {
8897
e.ID = key
8998
e.State = EventStateAdded
99+
e.Data = l.NewValue[key].Data
90100
es = append(es, e)
91101
}
92102
}
93103

94104
for key := range l.CurrentValue {
95-
var e Events
105+
var e Events[T]
96106
if _, ok := l.NewValue[key]; !ok {
97107
e.ID = key
98108
e.State = EventStateDeleted

listener_test.go

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func TestNewListener(t *testing.T) {
1919

2020
func TestListener_SetCallback(t *testing.T) {
2121
l := NewListener[S]()
22-
f := func(e []Events) {}
22+
f := func(e []Events[S]) {}
2323
l.SetCallback(f)
2424
assert.NotNil(t, l.EventCallback)
2525
}
@@ -32,10 +32,15 @@ func TestListener_AddNewValue(t *testing.T) {
3232
{F0: "2", F1: "test2", F2: ""},
3333
}
3434
l.AddNewValue(s)
35-
expected := map[string]string{
36-
"1": "{\"F0\":\"1\",\"F1\":\"test2\",\"F2\":\"\"}",
37-
"2": "{\"F0\":\"2\",\"F1\":\"test2\",\"F2\":\"\"}",
38-
}
35+
expected := map[string]Value[S]{
36+
"1": {
37+
Hash: "{\"F0\":\"1\",\"F1\":\"test2\",\"F2\":\"\"}",
38+
Data: S{F0: "1", F1: "test2", F2: ""},
39+
},
40+
"2": {
41+
Hash: "{\"F0\":\"2\",\"F1\":\"test2\",\"F2\":\"\"}",
42+
Data: S{F0: "2", F1: "test2", F2: ""},
43+
}}
3944
assert.Equal(t, expected, l.NewValue)
4045
}
4146

@@ -47,38 +52,43 @@ func TestListener_convertToMap(t *testing.T) {
4752
{F0: "2", F1: "test2", F2: ""},
4853
}
4954
actual := l.convertToMap(s)
50-
expected := map[string]string{
51-
"1": "{\"F0\":\"1\",\"F1\":\"test2\",\"F2\":\"\"}",
52-
"2": "{\"F0\":\"2\",\"F1\":\"test2\",\"F2\":\"\"}",
53-
}
55+
expected := map[string]Value[S]{
56+
"1": {
57+
Hash: "{\"F0\":\"1\",\"F1\":\"test2\",\"F2\":\"\"}",
58+
Data: S{F0: "1", F1: "test2", F2: ""},
59+
},
60+
"2": {
61+
Hash: "{\"F0\":\"2\",\"F1\":\"test2\",\"F2\":\"\"}",
62+
Data: S{F0: "2", F1: "test2", F2: ""},
63+
}}
5464
assert.Equal(t, expected, actual)
5565
}
5666

5767
func TestListener_compareMap(t *testing.T) {
5868
l := new(Listener[S])
59-
l.CurrentValue = map[string]string{
60-
"2": "2",
61-
"3": "6",
62-
"4": "4",
63-
"5": "5",
69+
l.CurrentValue = map[string]Value[S]{
70+
"2": {"{\"F0\":\"2\"}", S{F0: "2"}},
71+
"3": {"{\"F0\":\"3\"}", S{F0: "3"}},
72+
"4": {"{\"F0\":\"4\"}", S{F0: "4"}},
73+
"5": {"{\"F0\":\"5\"}", S{F0: "5"}},
6474
}
65-
l.NewValue = map[string]string{
66-
"1": "1",
67-
"2": "2",
68-
"3": "3",
69-
"4": "4",
75+
l.NewValue = map[string]Value[S]{
76+
"1": {"{\"F0\":\"1\"}", S{F0: "1"}},
77+
"2": {"{\"F0\":\"2\"}", S{F0: "2"}},
78+
"3": {"{\"F0\":\"3\",\"F2\": \"4\"}}", S{F0: "3", F2: "4"}},
79+
"4": {"{\"F0\":\"4\"}", S{F0: "4"}},
7080
}
7181

7282
e := l.compareMap()
73-
expected := []Events{
74-
{State: EventStateAdded, ID: "1"},
75-
{State: EventStateUpdated, ID: "3"},
76-
{State: EventStateDeleted, ID: "5"},
83+
expected := []Events[S]{
84+
{State: EventStateAdded, ID: "1", Data: S{F0: "1"}},
85+
{State: EventStateUpdated, ID: "3", Data: S{F0: "3", F2: "4"}},
86+
{State: EventStateDeleted, ID: "5", Data: S{}},
7787
}
7888
assert.Equal(t, expected, e)
7989

8090
// test compare with callback
81-
f := func(e []Events) {}
91+
f := func(e []Events[S]) {}
8292
l.SetCallback(f)
8393
e = l.compareMap()
8494
//no change event

0 commit comments

Comments
 (0)