Skip to content

Commit bbeb141

Browse files
committed
[pagination] Added an unwrap function to retrieve raw collection types
1 parent 27626b2 commit bbeb141

File tree

9 files changed

+116
-4
lines changed

9 files changed

+116
-4
lines changed

changes/20241030192708.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:sparkles: `[pagination]` Added an unwrap function to retrieve raw collection types

changes/20241030192749.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:bug: `[artefacts]` fix artefact collection unwrapping

utils/artefacts/artefacts.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,18 +232,23 @@ func (m *ArtefactManager) fetchJobArtefactsNextPage(ctx context.Context, current
232232
err = fmt.Errorf("%w: function to retrieve artefact managers was not properly defined", commonerrors.ErrUndefined)
233233
return
234234
}
235-
page, ok := paginationUtils.ToClientPage(currentPage).(*client.ArtefactManagerCollection)
235+
unwrappedPage := paginationUtils.UnwrapPage(currentPage)
236+
if unwrappedPage == nil {
237+
err = fmt.Errorf("%w: returned artefact managers page is empty", commonerrors.ErrUnexpected)
238+
return
239+
}
240+
page, ok := unwrappedPage.(*client.ArtefactManagerCollection)
236241
if !ok {
237-
err = fmt.Errorf("%w: returned build job page [%T] is not of the expected type [%v]", commonerrors.ErrUnexpected, currentPage, "*BuildJobCollection")
242+
err = fmt.Errorf("%w: returned artefact managers page[%T] is not of the expected type [%v]", commonerrors.ErrUnexpected, currentPage, "*ArtefactManagerCollection")
238243
return
239244
}
240245
links, has := page.GetLinksOk()
241246
if !has {
242-
err = fmt.Errorf("%w: returned page of build jobs has no links", commonerrors.ErrUnexpected)
247+
err = fmt.Errorf("%w: returned page of artefact managers has no links", commonerrors.ErrUnexpected)
243248
return
244249
}
245250
if !links.HasNext() {
246-
err = fmt.Errorf("%w: returned page of build job has no `next` link", commonerrors.ErrUnexpected)
251+
err = fmt.Errorf("%w: returned page of artefact managers has no `next` link", commonerrors.ErrUnexpected)
247252
return
248253
}
249254
link := links.GetNext()

utils/pagination/iterator.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,19 @@ func newClientIteratorMapper(iterator pagination.IIterator) client.IIterator {
6262
iterator: iterator,
6363
}
6464
}
65+
66+
// UnwrapIterator tends to unwraps the iterator mappers to retrieve the raw iterator.
67+
func UnwrapIterator(iterator any) any {
68+
if iterator == nil {
69+
return nil
70+
}
71+
wrappedIteratorMapper, ok := iterator.(*iteratorMapper)
72+
if ok {
73+
return UnwrapIterator(wrappedIteratorMapper.iterator)
74+
}
75+
wrappedClientIteratorMapper, ok := iterator.(*clientIteratorMapper)
76+
if ok {
77+
return UnwrapIterator(wrappedClientIteratorMapper.iterator)
78+
}
79+
return iterator
80+
}

utils/pagination/iterator_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,23 @@ func TestToIterator(t *testing.T) {
118118
})
119119
}
120120
}
121+
122+
func TestUnwrapIterator(t *testing.T) {
123+
var rawIterator client.IIterator
124+
rawIterator, err := client.NewArtefactManagerIterator([]client.ArtefactManagerItem{})
125+
require.NoError(t, err)
126+
require.NotNil(t, rawIterator)
127+
u, ok := rawIterator.(*client.ArtefactManagerIterator)
128+
assert.True(t, ok)
129+
assert.NotNil(t, u)
130+
wrappedIt := ToClientIterator(ToIterator(ToClientIterator(ToIterator(rawIterator))))
131+
require.NotNil(t, wrappedIt)
132+
u, ok = wrappedIt.(*client.ArtefactManagerIterator)
133+
assert.False(t, ok)
134+
assert.Nil(t, u)
135+
unwrappedIt := UnwrapIterator(wrappedIt)
136+
require.NotNil(t, unwrappedIt)
137+
u, ok = unwrappedIt.(*client.ArtefactManagerIterator)
138+
assert.True(t, ok)
139+
assert.NotNil(t, u)
140+
}

utils/pagination/page.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,19 @@ func newClientPageMapper(page pagination.IStaticPage) client.IStaticPage {
7878
page: page,
7979
}
8080
}
81+
82+
// UnwrapPage tends to unwraps the page mappers to retrieve the raw page object.
83+
func UnwrapPage(page any) any {
84+
if page == nil {
85+
return nil
86+
}
87+
wrappedPageMapper, ok := page.(*pageMapper)
88+
if ok {
89+
return UnwrapPage(wrappedPageMapper.page)
90+
}
91+
wrappedClientPageMapper, ok := page.(*clientPageMapper)
92+
if ok {
93+
return UnwrapPage(wrappedClientPageMapper.page)
94+
}
95+
return UnwrapIterator(page)
96+
}

utils/pagination/page_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,23 @@ func TestToPage(t *testing.T) {
129129
})
130130
}
131131
}
132+
133+
func TestUnwrapPage(t *testing.T) {
134+
var rawPage client.IStaticPage
135+
assert.Nil(t, rawPage)
136+
rawPage = client.NewArtefactManagerCollectionWithDefaults()
137+
require.NotNil(t, rawPage)
138+
u, ok := rawPage.(*client.ArtefactManagerCollection)
139+
assert.True(t, ok)
140+
assert.NotNil(t, u)
141+
wrappedPage := ToPage(ToClientPage(ToPage(ToClientPage(ToPage(rawPage)))))
142+
require.NotNil(t, wrappedPage)
143+
u, ok = wrappedPage.(*client.ArtefactManagerCollection)
144+
assert.False(t, ok)
145+
assert.Nil(t, u)
146+
unwrappedPage := UnwrapPage(wrappedPage)
147+
require.NotNil(t, unwrappedPage)
148+
u, ok = unwrappedPage.(*client.ArtefactManagerCollection)
149+
assert.True(t, ok)
150+
assert.NotNil(t, u)
151+
}

utils/pagination/stream.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,19 @@ func newClientStreamMapper(stream pagination.IStaticPageStream) client.IMessageS
8686
stream: stream,
8787
}
8888
}
89+
90+
// UnwrapStream tends to unwraps the stream mappers to retrieve the raw stream.
91+
func UnwrapStream(stream any) any {
92+
if stream == nil {
93+
return nil
94+
}
95+
wrappedStreamMapper, ok := stream.(*streamMapper)
96+
if ok {
97+
return UnwrapStream(wrappedStreamMapper.stream)
98+
}
99+
wrappedClientStreamMapper, ok := stream.(*clientStreamMapper)
100+
if ok {
101+
return UnwrapStream(wrappedClientStreamMapper.stream)
102+
}
103+
return UnwrapPage(stream)
104+
}

utils/pagination/stream_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,20 @@ func TestToStream(t *testing.T) {
125125
})
126126
}
127127
}
128+
func TestUnwrapStream(t *testing.T) {
129+
rawStream := client.NewNotificationFeedMessageStream()
130+
require.NotNil(t, rawStream)
131+
u, ok := rawStream.(*client.NotificationFeed)
132+
assert.True(t, ok)
133+
assert.NotNil(t, u)
134+
wrappedStream := ToStream(ToClientStream(ToStream(ToClientStream(ToStream(rawStream)))))
135+
require.NotNil(t, wrappedStream)
136+
u, ok = wrappedStream.(*client.NotificationFeed)
137+
assert.False(t, ok)
138+
assert.Nil(t, u)
139+
unwrappedStream := UnwrapStream(wrappedStream)
140+
require.NotNil(t, unwrappedStream)
141+
u, ok = unwrappedStream.(*client.NotificationFeed)
142+
assert.True(t, ok)
143+
assert.NotNil(t, u)
144+
}

0 commit comments

Comments
 (0)