Skip to content

Commit 219f31d

Browse files
committed
Use interface instead of function references
Signed-off-by: Javi Fontan <[email protected]>
1 parent c9ef221 commit 219f31d

File tree

2 files changed

+24
-38
lines changed

2 files changed

+24
-38
lines changed

repositories.go

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -95,47 +95,42 @@ func (i *RepositoryIter) Close() error {
9595
return nil
9696
}
9797

98-
type funcInitRepository func(Repository, interface{}) error
99-
type funcNextRow func(interface{}) (sql.Row, error)
100-
type funcClose func(interface{}) error
98+
// RowRepoIterImplementation is the interface needed by each iterator
99+
// implementation
100+
type RowRepoIterImplementation interface {
101+
InitRepository(Repository) error
102+
Next() (sql.Row, error)
103+
Close() error
104+
}
101105

102106
// RowRepoIter is used as the base to iterate over all the repositories
103107
// in the pool. It needs three functions that execute specific code per
104108
// implemented iterator.
105109
type RowRepoIter struct {
106110
repositoryIter *RepositoryIter
107111
repository *Repository
108-
data interface{}
109-
110-
funcInitRepository funcInitRepository
111-
funcNextRow funcNextRow
112-
funcClose funcClose
112+
implementation RowRepoIterImplementation
113113
}
114114

115115
// NewRowRepoIter initializes a new repository iterator.
116116
//
117117
// * pool: is a RepositoryPool we want to iterate
118-
// * data: this pointer will be passed to the provided functions and is useful
119-
// to save state like initialized iterators or other needed variables
120-
// * init: called when a new repository is about to be iterated, initialize
121-
// its iterator there
122-
// * next: called for each row
123-
// * close: called when a repository finished iterating
124-
func NewRowRepoIter(pool *RepositoryPool, data interface{},
125-
init funcInitRepository, next funcNextRow,
126-
close funcClose) (RowRepoIter, error) {
118+
// * impl: implementation with RowRepoIterImplementation interface
119+
// * InitRepository: called when a new repository is about to be iterated,
120+
// initialize its iterator there
121+
// * Next: called for each row
122+
// * Close: called when a repository finished iterating
123+
func NewRowRepoIter(pool *RepositoryPool,
124+
impl RowRepoIterImplementation) (RowRepoIter, error) {
127125

128126
rIter, err := pool.RepoIter()
129127
if err != nil {
130128
return RowRepoIter{}, err
131129
}
132130

133131
repo := RowRepoIter{
134-
repositoryIter: rIter,
135-
funcInitRepository: init,
136-
funcNextRow: next,
137-
funcClose: close,
138-
data: data,
132+
repositoryIter: rIter,
133+
implementation: impl,
139134
}
140135

141136
err = repo.nextRepository()
@@ -156,7 +151,7 @@ func (i *RowRepoIter) nextRepository() error {
156151
}
157152

158153
i.repository = repo
159-
err = i.funcInitRepository(*repo, i.data)
154+
err = i.implementation.InitRepository(*repo)
160155
if err != nil {
161156
return err
162157
}
@@ -167,7 +162,7 @@ func (i *RowRepoIter) nextRepository() error {
167162
// Next gets the next row
168163
func (i *RowRepoIter) Next() (sql.Row, error) {
169164
for {
170-
row, err := i.funcNextRow(i.data)
165+
row, err := i.implementation.Next()
171166

172167
switch err {
173168
case nil:
@@ -191,9 +186,7 @@ func (i *RowRepoIter) Next() (sql.Row, error) {
191186

192187
// Close called to close the iterator
193188
func (i *RowRepoIter) Close() error {
194-
if i.funcClose != nil {
195-
return i.funcClose(i.data)
196-
}
189+
return i.implementation.Close()
197190

198191
return nil
199192
}

repositories_test.go

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,7 @@ type testCommitIter struct {
135135
iter object.CommitIter
136136
}
137137

138-
func testInitRepository(repo Repository, data interface{}) error {
139-
d := data.(*testCommitIter)
140-
138+
func (d *testCommitIter) InitRepository(repo Repository) error {
141139
cIter, err := repo.Repo.CommitObjects()
142140
if err != nil {
143141
return err
@@ -148,9 +146,7 @@ func testInitRepository(repo Repository, data interface{}) error {
148146
return nil
149147
}
150148

151-
func testNextRow(data interface{}) (sql.Row, error) {
152-
d := data.(*testCommitIter)
153-
149+
func (d *testCommitIter) Next() (sql.Row, error) {
154150
_, err := d.iter.Next()
155151
if err != nil {
156152
return nil, err
@@ -159,9 +155,7 @@ func testNextRow(data interface{}) (sql.Row, error) {
159155
return nil, nil
160156
}
161157

162-
func testClose(data interface{}) error {
163-
d := data.(*testCommitIter)
164-
158+
func (d *testCommitIter) Close() error {
165159
if d.iter != nil {
166160
d.iter.Close()
167161
}
@@ -185,8 +179,7 @@ func TestRepositoryRowIterator(t *testing.T) {
185179

186180
cIter := &testCommitIter{}
187181

188-
rowRepoIter, err := NewRowRepoIter(pool, cIter, testInitRepository,
189-
testNextRow, testClose)
182+
rowRepoIter, err := NewRowRepoIter(&pool, cIter)
190183
require.Nil(err)
191184

192185
count := 0

0 commit comments

Comments
 (0)