Skip to content

Commit b27552d

Browse files
committed
all: use range over iterators
Now that we're requiring go 1.23, we can use iterator range. Signed-off-by: Roger Peppe <[email protected]> Change-Id: I57880294291d4b269199769cf91eedce29249f62 Reviewed-on: https://review.gerrithub.io/c/cue-labs/oci/+/1209150 TryBot-Result: CUE porcuepine <[email protected]> Reviewed-by: Daniel Martí <[email protected]>
1 parent 89224d4 commit b27552d

File tree

6 files changed

+33
-54
lines changed

6 files changed

+33
-54
lines changed

ociregistry/iter.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,23 @@
1414

1515
package ociregistry
1616

17-
// TODO(go1.23) when we can depend on Go 1.23, this should be:
17+
// TODO(go1.24) when we can depend on Go 1.24, this should be:
1818
// type Seq[T any] = iter.Seq2[T, error]
1919

2020
// Seq defines the type of an iterator sequence returned from
2121
// the iterator functions. In general, a non-nil
2222
// error means that the item is the last in the sequence.
2323
type Seq[T any] func(yield func(T, error) bool)
2424

25-
func All[T any](it Seq[T]) (_ []T, _err error) {
25+
func All[T any](it Seq[T]) ([]T, error) {
2626
xs := []T{}
27-
// TODO(go1.23) for x, err := range it
28-
it(func(x T, err error) bool {
27+
for x, err := range it {
2928
if err != nil {
30-
_err = err
31-
return false
29+
return nil, err
3230
}
3331
xs = append(xs, x)
34-
return true
35-
})
36-
return xs, _err
32+
}
33+
return xs, nil
3734
}
3835

3936
func SliceSeq[T any](xs []T) Seq[T] {

ociregistry/iter_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
//go:build go1.23
2-
31
package ociregistry
42

53
import (

ociregistry/ocidebug/debug.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -262,18 +262,17 @@ func logIterReturn[T any](r *logger, initialMsg string, it ociregistry.Seq[T]) o
262262
r.logf("%s {", initialMsg)
263263
items := []T{}
264264
var _err error
265-
it(func(item T, err error) bool {
265+
for item, err := range it {
266266
if err != nil {
267267
yield(*new(T), err)
268268
_err = err
269-
return false
269+
break
270270
}
271-
ok := yield(item, err)
272-
if ok {
273-
items = append(items, item)
271+
if !yield(item, nil) {
272+
break
274273
}
275-
return ok
276-
})
274+
items = append(items, item)
275+
}
277276
if _err != nil {
278277
if len(items) > 0 {
279278
r.logf("} -> %#v, %v", items, _err)

ociregistry/ocifilter/select.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -198,17 +198,18 @@ func (r *accessCheckerRegistry) Repositories(ctx context.Context, startAfter str
198198
return ociregistry.ErrorSeq[string](err)
199199
}
200200
return func(yield func(string, error) bool) {
201-
// TODO(go1.23): for name, err := range r.r.Repositories(ctx)
202-
r.r.Repositories(ctx, startAfter)(func(repo string, err error) bool {
201+
for repo, err := range r.r.Repositories(ctx, startAfter) {
203202
if err != nil {
204203
yield("", err)
205-
return false
204+
break
206205
}
207206
if r.check(repo, AccessRead) != nil {
208-
return true
207+
continue
209208
}
210-
return yield(repo, nil)
211-
})
209+
if !yield(repo, nil) {
210+
break
211+
}
212+
}
212213
}
213214
}
214215

ociregistry/ocifilter/sub.go

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,17 +143,15 @@ func (r *subRegistry) Repositories(ctx context.Context, startAfter string) ocire
143143
ctx = r.mapScopes(ctx)
144144
p := r.prefix + "/"
145145
return func(yield func(string, error) bool) {
146-
// TODO(go1.23): for name, err := range r.r.Repositories(ctx)
147-
r.r.Repositories(ctx, startAfter)(func(repo string, err error) bool {
146+
for repo, err := range r.r.Repositories(ctx, startAfter) {
148147
if err != nil {
149148
yield("", err)
150-
return false
149+
break
151150
}
152-
if p, ok := strings.CutPrefix(repo, p); ok {
153-
return yield(p, nil)
151+
if p, ok := strings.CutPrefix(repo, p); ok && !yield(p, nil) {
152+
break
154153
}
155-
return true
156-
})
154+
}
157155
}
158156
}
159157

@@ -178,13 +176,12 @@ func (r *subRegistry) mapScopes(ctx context.Context) context.Context {
178176
// that took an iterator, which could avoid the intermediate
179177
// slice allocation.
180178
scopes := make([]ociauth.ResourceScope, 0, scope.Len())
181-
scope.Iter()(func(rs ociauth.ResourceScope) bool {
179+
for rs := range scope.Iter() {
182180
if rs.ResourceType == ociauth.TypeRepository {
183181
rs.Resource = r.repo(rs.Resource)
184182
}
185183
scopes = append(scopes, rs)
186-
return true
187-
})
184+
}
188185
return ociauth.ContextWithScope(ctx, ociauth.NewScope(scopes...))
189186
}
190187

ociregistry/ociserver/lister.go

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (r *registry) handleCatalogList(ctx context.Context, resp http.ResponseWrit
8080
}
8181

8282
// TODO: implement handling of artifactType querystring
83-
func (r *registry) handleReferrersList(ctx context.Context, resp http.ResponseWriter, req *http.Request, rreq *ocirequest.Request) (_err error) {
83+
func (r *registry) handleReferrersList(ctx context.Context, resp http.ResponseWriter, req *http.Request, rreq *ocirequest.Request) error {
8484
if r.opts.DisableReferrersAPI {
8585
return withHTTPCode(http.StatusNotFound, fmt.Errorf("referrers API has been disabled"))
8686
}
@@ -91,18 +91,11 @@ func (r *registry) handleReferrersList(ctx context.Context, resp http.ResponseWr
9191
}
9292

9393
// TODO support artifactType filtering
94-
it := r.backend.Referrers(ctx, rreq.Repo, ociregistry.Digest(rreq.Digest), "")
95-
// TODO(go1.23) for desc, err := range it {
96-
it(func(desc ociregistry.Descriptor, err error) bool {
94+
for desc, err := range r.backend.Referrers(ctx, rreq.Repo, ociregistry.Digest(rreq.Digest), "") {
9795
if err != nil {
98-
_err = err
99-
return false
96+
return err
10097
}
10198
im.Manifests = append(im.Manifests, desc)
102-
return true
103-
})
104-
if _err != nil {
105-
return _err
10699
}
107100
msg, err := json.Marshal(im)
108101
if err != nil {
@@ -115,7 +108,7 @@ func (r *registry) handleReferrersList(ctx context.Context, resp http.ResponseWr
115108
return nil
116109
}
117110

118-
func (r *registry) nextListResults(req *http.Request, rreq *ocirequest.Request, itemsIter ociregistry.Seq[string]) (items []string, link string, _err error) {
111+
func (r *registry) nextListResults(req *http.Request, rreq *ocirequest.Request, itemsIter ociregistry.Seq[string]) (items []string, link string, _ error) {
119112
if r.opts.MaxListPageSize > 0 && rreq.ListN > r.opts.MaxListPageSize {
120113
return nil, "", ociregistry.NewError(fmt.Sprintf("query parameter n is too large (n=%d, max=%d)", rreq.ListN, r.opts.MaxListPageSize), ociregistry.ErrUnsupported.Code(), nil)
121114
}
@@ -124,24 +117,18 @@ func (r *registry) nextListResults(req *http.Request, rreq *ocirequest.Request,
124117
n = maxPageSize
125118
}
126119
truncated := false
127-
// TODO(go1.23) for repo, err := range itemsIter {
128-
itemsIter(func(item string, err error) bool {
120+
for item, err := range itemsIter {
129121
if err != nil {
130-
_err = err
131-
return false
122+
return nil, "", err
132123
}
133124
if rreq.ListN > 0 && len(items) >= rreq.ListN {
134125
truncated = true
135-
return false
126+
break
136127
}
137128
// TODO we might want some way to limit on the total number
138129
// of items returned in the absence of a ListN limit.
139130
items = append(items, item)
140131
// TODO sanity check that the items are in lexical order?
141-
return true
142-
})
143-
if _err != nil {
144-
return nil, "", _err
145132
}
146133
if truncated && !r.opts.OmitLinkHeaderFromResponses {
147134
link = r.makeNextLink(req, items[len(items)-1])

0 commit comments

Comments
 (0)