Browse code

api/types: use regular slices for disk usage types

Signed-off-by: Austin Vazquez <austin.vazquez@docker.com>

Austin Vazquez authored on 2025/11/06 05:39:20
Showing 15 changed files
... ...
@@ -2096,7 +2096,6 @@ definitions:
2096 2096
         type: "array"
2097 2097
         x-omitempty: true
2098 2098
         items:
2099
-          x-nullable: true
2100 2099
           x-go-type:
2101 2100
             type: Summary
2102 2101
 
... ...
@@ -2279,7 +2278,6 @@ definitions:
2279 2279
         type: "array"
2280 2280
         x-omitempty: true
2281 2281
         items:
2282
-          x-nullable: true
2283 2282
           x-go-type:
2284 2283
             type: Volume
2285 2284
 
... ...
@@ -2893,7 +2891,6 @@ definitions:
2893 2893
         type: "array"
2894 2894
         x-omitempty: true
2895 2895
         items:
2896
-          x-nullable: true
2897 2896
           x-go-type:
2898 2897
             type: CacheRecord
2899 2898
 
... ...
@@ -5617,7 +5614,6 @@ definitions:
5617 5617
         type: "array"
5618 5618
         x-omitempty: true
5619 5619
         items:
5620
-          x-nullable: true
5621 5620
           x-go-type:
5622 5621
             type: Summary
5623 5622
 
... ...
@@ -2096,7 +2096,6 @@ definitions:
2096 2096
         type: "array"
2097 2097
         x-omitempty: true
2098 2098
         items:
2099
-          x-nullable: true
2100 2099
           x-go-type:
2101 2100
             type: Summary
2102 2101
 
... ...
@@ -2279,7 +2278,6 @@ definitions:
2279 2279
         type: "array"
2280 2280
         x-omitempty: true
2281 2281
         items:
2282
-          x-nullable: true
2283 2282
           x-go-type:
2284 2283
             type: Volume
2285 2284
 
... ...
@@ -2893,7 +2891,6 @@ definitions:
2893 2893
         type: "array"
2894 2894
         x-omitempty: true
2895 2895
         items:
2896
-          x-nullable: true
2897 2896
           x-go-type:
2898 2897
             type: CacheRecord
2899 2898
 
... ...
@@ -5617,7 +5614,6 @@ definitions:
5617 5617
         type: "array"
5618 5618
         x-omitempty: true
5619 5619
         items:
5620
-          x-nullable: true
5621 5620
           x-go-type:
5622 5621
             type: Summary
5623 5622
 
... ...
@@ -17,7 +17,7 @@ type DiskUsage struct {
17 17
 
18 18
 	// List of build cache records.
19 19
 	//
20
-	Items []*CacheRecord `json:"Items,omitempty"`
20
+	Items []CacheRecord `json:"Items,omitempty"`
21 21
 
22 22
 	// Disk space that can be reclaimed by removing inactive build cache records.
23 23
 	//
... ...
@@ -17,7 +17,7 @@ type DiskUsage struct {
17 17
 
18 18
 	// List of container summaries.
19 19
 	//
20
-	Items []*Summary `json:"Items,omitempty"`
20
+	Items []Summary `json:"Items,omitempty"`
21 21
 
22 22
 	// Disk space that can be reclaimed by removing inactive containers.
23 23
 	//
... ...
@@ -17,7 +17,7 @@ type DiskUsage struct {
17 17
 
18 18
 	// List of image summaries.
19 19
 	//
20
-	Items []*Summary `json:"Items,omitempty"`
20
+	Items []Summary `json:"Items,omitempty"`
21 21
 
22 22
 	// Disk space that can be reclaimed by removing unused images.
23 23
 	//
... ...
@@ -17,7 +17,7 @@ type DiskUsage struct {
17 17
 
18 18
 	// List of volumes.
19 19
 	//
20
-	Items []*Volume `json:"Items,omitempty"`
20
+	Items []Volume `json:"Items,omitempty"`
21 21
 
22 22
 	// Disk space that can be reclaimed by removing inactive volumes.
23 23
 	//
... ...
@@ -5,6 +5,7 @@ import (
5 5
 	"encoding/json"
6 6
 	"fmt"
7 7
 	"net/url"
8
+	"slices"
8 9
 
9 10
 	"github.com/moby/moby/api/types/build"
10 11
 	"github.com/moby/moby/api/types/container"
... ...
@@ -151,14 +152,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
151 151
 		return DiskUsageResult{}, fmt.Errorf("Error retrieving disk usage: %v", err)
152 152
 	}
153 153
 
154
-	var (
155
-		r              DiskUsageResult
156
-		imagesFrom     = []*image.Summary{}
157
-		containersFrom = []*container.Summary{}
158
-		volumesFrom    = []*volume.Volume{}
159
-		buildCacheFrom = []*build.CacheRecord{}
160
-	)
161
-
154
+	var r DiskUsageResult
162 155
 	if du.ImageUsage != nil {
163 156
 		r.Images = ImagesDiskUsage{
164 157
 			ActiveImages: du.ImageUsage.ActiveImages,
... ...
@@ -168,7 +162,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
168 168
 		}
169 169
 
170 170
 		if options.Verbose {
171
-			imagesFrom = du.ImageUsage.Items
171
+			r.Images.Items = slices.Clone(du.ImageUsage.Items)
172 172
 		}
173 173
 	} else {
174 174
 		// Fallback for legacy response.
... ...
@@ -176,16 +170,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
176 176
 			TotalSize: du.LayersSize,
177 177
 		}
178 178
 
179
-		if du.Images != nil && options.Verbose {
180
-			imagesFrom = du.Images
179
+		if options.Verbose {
180
+			r.Images.Items = slices.Collect(func(yield func(image.Summary) bool) {
181
+				for _, i := range du.Images {
182
+					if !yield(*i) {
183
+						return
184
+					}
185
+				}
186
+			})
181 187
 		}
182 188
 	}
183 189
 
184
-	r.Images.Items = make([]image.Summary, len(imagesFrom))
185
-	for i, ii := range imagesFrom {
186
-		r.Images.Items[i] = *ii
187
-	}
188
-
189 190
 	if du.ContainerUsage != nil {
190 191
 		r.Containers = ContainersDiskUsage{
191 192
 			ActiveContainers: du.ContainerUsage.ActiveContainers,
... ...
@@ -195,16 +190,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
195 195
 		}
196 196
 
197 197
 		if options.Verbose {
198
-			containersFrom = du.ContainerUsage.Items
198
+			r.Containers.Items = slices.Clone(du.ContainerUsage.Items)
199 199
 		}
200 200
 	} else if du.Containers != nil && options.Verbose {
201 201
 		// Fallback for legacy response.
202
-		containersFrom = du.Containers
203
-	}
204
-
205
-	r.Containers.Items = make([]container.Summary, len(containersFrom))
206
-	for i, c := range containersFrom {
207
-		r.Containers.Items[i] = *c
202
+		r.Containers.Items = slices.Collect(func(yield func(container.Summary) bool) {
203
+			for _, c := range du.Containers {
204
+				if !yield(*c) {
205
+					return
206
+				}
207
+			}
208
+		})
208 209
 	}
209 210
 
210 211
 	if du.BuildCacheUsage != nil {
... ...
@@ -216,16 +212,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
216 216
 		}
217 217
 
218 218
 		if options.Verbose {
219
-			buildCacheFrom = du.BuildCacheUsage.Items
219
+			r.BuildCache.Items = slices.Clone(du.BuildCacheUsage.Items)
220 220
 		}
221 221
 	} else if du.BuildCache != nil && options.Verbose {
222 222
 		// Fallback for legacy response.
223
-		buildCacheFrom = du.BuildCache
224
-	}
225
-
226
-	r.BuildCache.Items = make([]build.CacheRecord, len(buildCacheFrom))
227
-	for i, b := range buildCacheFrom {
228
-		r.BuildCache.Items[i] = *b
223
+		r.BuildCache.Items = slices.Collect(func(yield func(build.CacheRecord) bool) {
224
+			for _, b := range du.BuildCache {
225
+				if !yield(*b) {
226
+					return
227
+				}
228
+			}
229
+		})
229 230
 	}
230 231
 
231 232
 	if du.VolumeUsage != nil {
... ...
@@ -237,16 +234,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
237 237
 		}
238 238
 
239 239
 		if options.Verbose {
240
-			volumesFrom = du.VolumeUsage.Items
240
+			r.Volumes.Items = slices.Clone(du.VolumeUsage.Items)
241 241
 		}
242 242
 	} else if du.Volumes != nil && options.Verbose {
243 243
 		// Fallback for legacy response.
244
-		volumesFrom = du.Volumes
245
-	}
246
-
247
-	r.Volumes.Items = make([]volume.Volume, len(volumesFrom))
248
-	for i, v := range volumesFrom {
249
-		r.Volumes.Items[i] = *v
244
+		r.Volumes.Items = slices.Collect(func(yield func(volume.Volume) bool) {
245
+			for _, v := range du.Volumes {
246
+				if !yield(*v) {
247
+					return
248
+				}
249
+			}
250
+		})
250 251
 	}
251 252
 
252 253
 	return r, nil
... ...
@@ -33,7 +33,7 @@ func TestDiskUsage(t *testing.T) {
33 33
 				TotalImages:  0,
34 34
 				Reclaimable:  0,
35 35
 				TotalSize:    4096,
36
-				Items:        []*image.Summary{},
36
+				Items:        []image.Summary{},
37 37
 			},
38 38
 		})(req)
39 39
 	}))
... ...
@@ -5,6 +5,7 @@ import (
5 5
 	"encoding/json"
6 6
 	"fmt"
7 7
 	"net/http"
8
+	"slices"
8 9
 	"strconv"
9 10
 	"time"
10 11
 
... ...
@@ -230,7 +231,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter,
230 230
 			v.LayersSize = systemDiskUsage.Images.TotalSize //nolint: staticcheck,SA1019: v.LayersSize is deprecated: kept to maintain backwards compatibility with API < v1.52, use [ImagesDiskUsage.TotalSize] instead.
231 231
 			v.Images = systemDiskUsage.Images.Items         //nolint: staticcheck,SA1019: v.Images is deprecated: kept to maintain backwards compatibility with API < v1.52, use [ImagesDiskUsage.Items] instead.
232 232
 		} else if verbose {
233
-			v.ImageUsage.Items = systemDiskUsage.Images.Items
233
+			v.ImageUsage.Items = slices.Collect(func(yield func(image.Summary) bool) {
234
+				for _, i := range systemDiskUsage.Images.Items {
235
+					if !yield(*i) {
236
+						return
237
+					}
238
+				}
239
+			})
234 240
 		}
235 241
 	}
236 242
 	if systemDiskUsage != nil && systemDiskUsage.Containers != nil {
... ...
@@ -244,7 +251,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter,
244 244
 		if legacyFields {
245 245
 			v.Containers = systemDiskUsage.Containers.Items //nolint: staticcheck,SA1019: v.Containers is deprecated: kept to maintain backwards compatibility with API < v1.52, use [ContainersDiskUsage.Items] instead.
246 246
 		} else if verbose {
247
-			v.ContainerUsage.Items = systemDiskUsage.Containers.Items
247
+			v.ContainerUsage.Items = slices.Collect(func(yield func(container.Summary) bool) {
248
+				for _, c := range systemDiskUsage.Containers.Items {
249
+					if !yield(*c) {
250
+						return
251
+					}
252
+				}
253
+			})
248 254
 		}
249 255
 	}
250 256
 	if systemDiskUsage != nil && systemDiskUsage.Volumes != nil {
... ...
@@ -258,7 +271,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter,
258 258
 		if legacyFields {
259 259
 			v.Volumes = systemDiskUsage.Volumes.Items //nolint: staticcheck,SA1019: v.Volumes is deprecated: kept to maintain backwards compatibility with API < v1.52, use [VolumesDiskUsage.Items] instead.
260 260
 		} else if verbose {
261
-			v.VolumeUsage.Items = systemDiskUsage.Volumes.Items
261
+			v.VolumeUsage.Items = slices.Collect(func(yield func(volume.Volume) bool) {
262
+				for _, v := range systemDiskUsage.Volumes.Items {
263
+					if !yield(*v) {
264
+						return
265
+					}
266
+				}
267
+			})
262 268
 		}
263 269
 	}
264 270
 	if getBuildCache {
... ...
@@ -289,7 +308,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter,
289 289
 		if legacyFields {
290 290
 			v.BuildCache = buildCache //nolint: staticcheck,SA1019: v.BuildCache is deprecated: kept to maintain backwards compatibility with API < v1.52, use [BuildCacheDiskUsage.Items] instead.
291 291
 		} else if verbose {
292
-			v.BuildCacheUsage.Items = buildCache
292
+			v.BuildCacheUsage.Items = slices.Collect(func(yield func(buildtypes.CacheRecord) bool) {
293
+				for _, b := range buildCache {
294
+					if !yield(*b) {
295
+						return
296
+					}
297
+				}
298
+			})
293 299
 		}
294 300
 	}
295 301
 	return httputils.WriteJSON(w, http.StatusOK, v)
... ...
@@ -5,10 +5,6 @@ import (
5 5
 	"testing"
6 6
 
7 7
 	"github.com/google/go-cmp/cmp/cmpopts"
8
-	"github.com/moby/moby/api/types/build"
9
-	containertypes "github.com/moby/moby/api/types/container"
10
-	"github.com/moby/moby/api/types/image"
11
-	"github.com/moby/moby/api/types/volume"
12 8
 	"github.com/moby/moby/client"
13 9
 	"github.com/moby/moby/v2/integration/internal/container"
14 10
 	"github.com/moby/moby/v2/internal/testutil"
... ...
@@ -56,19 +52,12 @@ func TestDiskUsage(t *testing.T) {
56 56
 				}
57 57
 
58 58
 				assert.DeepEqual(t, du, client.DiskUsageResult{
59
-					Containers: client.ContainersDiskUsage{
60
-						Items: []containertypes.Summary{},
61
-					},
59
+					Containers: client.ContainersDiskUsage{},
62 60
 					Images: client.ImagesDiskUsage{
63 61
 						TotalSize: expectedLayersSize,
64
-						Items:     []image.Summary{},
65
-					},
66
-					BuildCache: client.BuildCacheDiskUsage{
67
-						Items: []build.CacheRecord{},
68
-					},
69
-					Volumes: client.VolumesDiskUsage{
70
-						Items: []volume.Volume{},
71 62
 					},
63
+					BuildCache: client.BuildCacheDiskUsage{},
64
+					Volumes:    client.VolumesDiskUsage{},
72 65
 				})
73 66
 				return du
74 67
 			},
... ...
@@ -155,9 +144,9 @@ func TestDiskUsage(t *testing.T) {
155 155
 					},
156 156
 					expected: client.DiskUsageResult{
157 157
 						Containers: stepDU.Containers,
158
-						Images:     client.ImagesDiskUsage{Items: []image.Summary{}},
159
-						BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}},
160
-						Volumes:    client.VolumesDiskUsage{Items: []volume.Volume{}},
158
+						Images:     client.ImagesDiskUsage{},
159
+						BuildCache: client.BuildCacheDiskUsage{},
160
+						Volumes:    client.VolumesDiskUsage{},
161 161
 					},
162 162
 				},
163 163
 				{
... ...
@@ -167,10 +156,10 @@ func TestDiskUsage(t *testing.T) {
167 167
 						Verbose: true,
168 168
 					},
169 169
 					expected: client.DiskUsageResult{
170
-						Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}},
170
+						Containers: client.ContainersDiskUsage{},
171 171
 						Images:     stepDU.Images,
172
-						BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}},
173
-						Volumes:    client.VolumesDiskUsage{Items: []volume.Volume{}},
172
+						BuildCache: client.BuildCacheDiskUsage{},
173
+						Volumes:    client.VolumesDiskUsage{},
174 174
 					},
175 175
 				},
176 176
 				{
... ...
@@ -180,9 +169,9 @@ func TestDiskUsage(t *testing.T) {
180 180
 						Verbose: true,
181 181
 					},
182 182
 					expected: client.DiskUsageResult{
183
-						Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}},
184
-						Images:     client.ImagesDiskUsage{Items: []image.Summary{}},
185
-						BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}},
183
+						Containers: client.ContainersDiskUsage{},
184
+						Images:     client.ImagesDiskUsage{},
185
+						BuildCache: client.BuildCacheDiskUsage{},
186 186
 						Volumes:    stepDU.Volumes,
187 187
 					},
188 188
 				},
... ...
@@ -193,10 +182,10 @@ func TestDiskUsage(t *testing.T) {
193 193
 						Verbose:    true,
194 194
 					},
195 195
 					expected: client.DiskUsageResult{
196
-						Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}},
197
-						Images:     client.ImagesDiskUsage{Items: []image.Summary{}},
196
+						Containers: client.ContainersDiskUsage{},
197
+						Images:     client.ImagesDiskUsage{},
198 198
 						BuildCache: stepDU.BuildCache,
199
-						Volumes:    client.VolumesDiskUsage{Items: []volume.Volume{}},
199
+						Volumes:    client.VolumesDiskUsage{},
200 200
 					},
201 201
 				},
202 202
 				{
... ...
@@ -208,8 +197,8 @@ func TestDiskUsage(t *testing.T) {
208 208
 					},
209 209
 					expected: client.DiskUsageResult{
210 210
 						Containers: stepDU.Containers,
211
-						Images:     client.ImagesDiskUsage{Items: []image.Summary{}},
212
-						BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}},
211
+						Images:     client.ImagesDiskUsage{},
212
+						BuildCache: client.BuildCacheDiskUsage{},
213 213
 						Volumes:    stepDU.Volumes,
214 214
 					},
215 215
 				},
... ...
@@ -221,10 +210,10 @@ func TestDiskUsage(t *testing.T) {
221 221
 						Verbose:    true,
222 222
 					},
223 223
 					expected: client.DiskUsageResult{
224
-						Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}},
224
+						Containers: client.ContainersDiskUsage{},
225 225
 						Images:     stepDU.Images,
226 226
 						BuildCache: stepDU.BuildCache,
227
-						Volumes:    client.VolumesDiskUsage{Items: []volume.Volume{}},
227
+						Volumes:    client.VolumesDiskUsage{},
228 228
 					},
229 229
 				},
230 230
 				{
... ...
@@ -237,9 +226,7 @@ func TestDiskUsage(t *testing.T) {
237 237
 					},
238 238
 					expected: client.DiskUsageResult{
239 239
 						Containers: stepDU.Containers,
240
-						Images: client.ImagesDiskUsage{
241
-							Items: []image.Summary{},
242
-						},
240
+						Images:     client.ImagesDiskUsage{},
243 241
 						BuildCache: stepDU.BuildCache,
244 242
 						Volumes:    stepDU.Volumes,
245 243
 					},
... ...
@@ -253,9 +240,7 @@ func TestDiskUsage(t *testing.T) {
253 253
 						Verbose:    true,
254 254
 					},
255 255
 					expected: client.DiskUsageResult{
256
-						Containers: client.ContainersDiskUsage{
257
-							Items: []containertypes.Summary{},
258
-						},
256
+						Containers: client.ContainersDiskUsage{},
259 257
 						Images:     stepDU.Images,
260 258
 						BuildCache: stepDU.BuildCache,
261 259
 						Volumes:    stepDU.Volumes,
... ...
@@ -272,10 +257,8 @@ func TestDiskUsage(t *testing.T) {
272 272
 					expected: client.DiskUsageResult{
273 273
 						Containers: stepDU.Containers,
274 274
 						Images:     stepDU.Images,
275
-						BuildCache: client.BuildCacheDiskUsage{
276
-							Items: []build.CacheRecord{},
277
-						},
278
-						Volumes: stepDU.Volumes,
275
+						BuildCache: client.BuildCacheDiskUsage{},
276
+						Volumes:    stepDU.Volumes,
279 277
 					},
280 278
 				},
281 279
 				{
... ...
@@ -17,7 +17,7 @@ type DiskUsage struct {
17 17
 
18 18
 	// List of build cache records.
19 19
 	//
20
-	Items []*CacheRecord `json:"Items,omitempty"`
20
+	Items []CacheRecord `json:"Items,omitempty"`
21 21
 
22 22
 	// Disk space that can be reclaimed by removing inactive build cache records.
23 23
 	//
... ...
@@ -17,7 +17,7 @@ type DiskUsage struct {
17 17
 
18 18
 	// List of container summaries.
19 19
 	//
20
-	Items []*Summary `json:"Items,omitempty"`
20
+	Items []Summary `json:"Items,omitempty"`
21 21
 
22 22
 	// Disk space that can be reclaimed by removing inactive containers.
23 23
 	//
... ...
@@ -17,7 +17,7 @@ type DiskUsage struct {
17 17
 
18 18
 	// List of image summaries.
19 19
 	//
20
-	Items []*Summary `json:"Items,omitempty"`
20
+	Items []Summary `json:"Items,omitempty"`
21 21
 
22 22
 	// Disk space that can be reclaimed by removing unused images.
23 23
 	//
... ...
@@ -17,7 +17,7 @@ type DiskUsage struct {
17 17
 
18 18
 	// List of volumes.
19 19
 	//
20
-	Items []*Volume `json:"Items,omitempty"`
20
+	Items []Volume `json:"Items,omitempty"`
21 21
 
22 22
 	// Disk space that can be reclaimed by removing inactive volumes.
23 23
 	//
... ...
@@ -5,6 +5,7 @@ import (
5 5
 	"encoding/json"
6 6
 	"fmt"
7 7
 	"net/url"
8
+	"slices"
8 9
 
9 10
 	"github.com/moby/moby/api/types/build"
10 11
 	"github.com/moby/moby/api/types/container"
... ...
@@ -151,14 +152,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
151 151
 		return DiskUsageResult{}, fmt.Errorf("Error retrieving disk usage: %v", err)
152 152
 	}
153 153
 
154
-	var (
155
-		r              DiskUsageResult
156
-		imagesFrom     = []*image.Summary{}
157
-		containersFrom = []*container.Summary{}
158
-		volumesFrom    = []*volume.Volume{}
159
-		buildCacheFrom = []*build.CacheRecord{}
160
-	)
161
-
154
+	var r DiskUsageResult
162 155
 	if du.ImageUsage != nil {
163 156
 		r.Images = ImagesDiskUsage{
164 157
 			ActiveImages: du.ImageUsage.ActiveImages,
... ...
@@ -168,7 +162,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
168 168
 		}
169 169
 
170 170
 		if options.Verbose {
171
-			imagesFrom = du.ImageUsage.Items
171
+			r.Images.Items = slices.Clone(du.ImageUsage.Items)
172 172
 		}
173 173
 	} else {
174 174
 		// Fallback for legacy response.
... ...
@@ -176,16 +170,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
176 176
 			TotalSize: du.LayersSize,
177 177
 		}
178 178
 
179
-		if du.Images != nil && options.Verbose {
180
-			imagesFrom = du.Images
179
+		if options.Verbose {
180
+			r.Images.Items = slices.Collect(func(yield func(image.Summary) bool) {
181
+				for _, i := range du.Images {
182
+					if !yield(*i) {
183
+						return
184
+					}
185
+				}
186
+			})
181 187
 		}
182 188
 	}
183 189
 
184
-	r.Images.Items = make([]image.Summary, len(imagesFrom))
185
-	for i, ii := range imagesFrom {
186
-		r.Images.Items[i] = *ii
187
-	}
188
-
189 190
 	if du.ContainerUsage != nil {
190 191
 		r.Containers = ContainersDiskUsage{
191 192
 			ActiveContainers: du.ContainerUsage.ActiveContainers,
... ...
@@ -195,16 +190,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
195 195
 		}
196 196
 
197 197
 		if options.Verbose {
198
-			containersFrom = du.ContainerUsage.Items
198
+			r.Containers.Items = slices.Clone(du.ContainerUsage.Items)
199 199
 		}
200 200
 	} else if du.Containers != nil && options.Verbose {
201 201
 		// Fallback for legacy response.
202
-		containersFrom = du.Containers
203
-	}
204
-
205
-	r.Containers.Items = make([]container.Summary, len(containersFrom))
206
-	for i, c := range containersFrom {
207
-		r.Containers.Items[i] = *c
202
+		r.Containers.Items = slices.Collect(func(yield func(container.Summary) bool) {
203
+			for _, c := range du.Containers {
204
+				if !yield(*c) {
205
+					return
206
+				}
207
+			}
208
+		})
208 209
 	}
209 210
 
210 211
 	if du.BuildCacheUsage != nil {
... ...
@@ -216,16 +212,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
216 216
 		}
217 217
 
218 218
 		if options.Verbose {
219
-			buildCacheFrom = du.BuildCacheUsage.Items
219
+			r.BuildCache.Items = slices.Clone(du.BuildCacheUsage.Items)
220 220
 		}
221 221
 	} else if du.BuildCache != nil && options.Verbose {
222 222
 		// Fallback for legacy response.
223
-		buildCacheFrom = du.BuildCache
224
-	}
225
-
226
-	r.BuildCache.Items = make([]build.CacheRecord, len(buildCacheFrom))
227
-	for i, b := range buildCacheFrom {
228
-		r.BuildCache.Items[i] = *b
223
+		r.BuildCache.Items = slices.Collect(func(yield func(build.CacheRecord) bool) {
224
+			for _, b := range du.BuildCache {
225
+				if !yield(*b) {
226
+					return
227
+				}
228
+			}
229
+		})
229 230
 	}
230 231
 
231 232
 	if du.VolumeUsage != nil {
... ...
@@ -237,16 +234,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis
237 237
 		}
238 238
 
239 239
 		if options.Verbose {
240
-			volumesFrom = du.VolumeUsage.Items
240
+			r.Volumes.Items = slices.Clone(du.VolumeUsage.Items)
241 241
 		}
242 242
 	} else if du.Volumes != nil && options.Verbose {
243 243
 		// Fallback for legacy response.
244
-		volumesFrom = du.Volumes
245
-	}
246
-
247
-	r.Volumes.Items = make([]volume.Volume, len(volumesFrom))
248
-	for i, v := range volumesFrom {
249
-		r.Volumes.Items[i] = *v
244
+		r.Volumes.Items = slices.Collect(func(yield func(volume.Volume) bool) {
245
+			for _, v := range du.Volumes {
246
+				if !yield(*v) {
247
+					return
248
+				}
249
+			}
250
+		})
250 251
 	}
251 252
 
252 253
 	return r, nil