1// Copyright 2019 Google LLC 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// https://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// Code generated by gapic-generator. DO NOT EDIT. 16 17package grafeas 18 19import ( 20 "context" 21 "fmt" 22 "math" 23 "time" 24 25 "github.com/golang/protobuf/proto" 26 gax "github.com/googleapis/gax-go/v2" 27 "google.golang.org/api/iterator" 28 "google.golang.org/api/option" 29 "google.golang.org/api/transport" 30 grafeaspb "google.golang.org/genproto/googleapis/grafeas/v1" 31 "google.golang.org/grpc" 32 "google.golang.org/grpc/codes" 33 "google.golang.org/grpc/metadata" 34) 35 36// CallOptions contains the retry settings for each method of Client. 37type CallOptions struct { 38 GetOccurrence []gax.CallOption 39 ListOccurrences []gax.CallOption 40 DeleteOccurrence []gax.CallOption 41 CreateOccurrence []gax.CallOption 42 BatchCreateOccurrences []gax.CallOption 43 UpdateOccurrence []gax.CallOption 44 GetOccurrenceNote []gax.CallOption 45 GetNote []gax.CallOption 46 ListNotes []gax.CallOption 47 DeleteNote []gax.CallOption 48 CreateNote []gax.CallOption 49 BatchCreateNotes []gax.CallOption 50 UpdateNote []gax.CallOption 51 ListNoteOccurrences []gax.CallOption 52} 53 54func defaultCallOptions() *CallOptions { 55 retry := map[[2]string][]gax.CallOption{ 56 {"default", "idempotent"}: { 57 gax.WithRetry(func() gax.Retryer { 58 return gax.OnCodes([]codes.Code{ 59 codes.DeadlineExceeded, 60 codes.Unavailable, 61 }, gax.Backoff{ 62 Initial: 100 * time.Millisecond, 63 Max: 60000 * time.Millisecond, 64 Multiplier: 1.3, 65 }) 66 }), 67 }, 68 } 69 return &CallOptions{ 70 GetOccurrence: retry[[2]string{"default", "idempotent"}], 71 ListOccurrences: retry[[2]string{"default", "idempotent"}], 72 DeleteOccurrence: retry[[2]string{"default", "idempotent"}], 73 CreateOccurrence: retry[[2]string{"default", "non_idempotent"}], 74 BatchCreateOccurrences: retry[[2]string{"default", "non_idempotent"}], 75 UpdateOccurrence: retry[[2]string{"default", "non_idempotent"}], 76 GetOccurrenceNote: retry[[2]string{"default", "idempotent"}], 77 GetNote: retry[[2]string{"default", "idempotent"}], 78 ListNotes: retry[[2]string{"default", "idempotent"}], 79 DeleteNote: retry[[2]string{"default", "idempotent"}], 80 CreateNote: retry[[2]string{"default", "non_idempotent"}], 81 BatchCreateNotes: retry[[2]string{"default", "non_idempotent"}], 82 UpdateNote: retry[[2]string{"default", "non_idempotent"}], 83 ListNoteOccurrences: retry[[2]string{"default", "idempotent"}], 84 } 85} 86 87// Client is a client for interacting with Container Analysis API. 88// 89// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. 90type Client struct { 91 // The connection to the service. 92 conn *grpc.ClientConn 93 94 // The gRPC API client. 95 client grafeaspb.GrafeasClient 96 97 // The call options for this service. 98 CallOptions *CallOptions 99 100 // The x-goog-* metadata to be sent with each request. 101 xGoogMetadata metadata.MD 102} 103 104// NewClient creates a new grafeas client. 105// 106// Grafeas (at grafeas.io) API. 107// 108// Retrieves analysis results of Cloud components such as Docker container 109// images. 110// 111// Analysis results are stored as a series of occurrences. An Occurrence 112// contains information about a specific analysis instance on a resource. An 113// occurrence refers to a Note. A note contains details describing the 114// analysis and is generally stored in a separate project, called a Provider. 115// Multiple occurrences can refer to the same note. 116// 117// For example, an SSL vulnerability could affect multiple images. In this case, 118// there would be one note for the vulnerability and an occurrence for each 119// image with the vulnerability referring to that note. 120func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) { 121 conn, err := transport.DialGRPC(ctx, opts...) 122 if err != nil { 123 return nil, err 124 } 125 c := &Client{ 126 conn: conn, 127 CallOptions: defaultCallOptions(), 128 129 client: grafeaspb.NewGrafeasClient(conn), 130 } 131 c.setGoogleClientInfo() 132 return c, nil 133} 134 135// Connection returns the client's connection to the API service. 136func (c *Client) Connection() *grpc.ClientConn { 137 return c.conn 138} 139 140// Close closes the connection to the API service. The user should invoke this when 141// the client is no longer required. 142func (c *Client) Close() error { 143 return c.conn.Close() 144} 145 146// setGoogleClientInfo sets the name and version of the application in 147// the `x-goog-api-client` header passed on each request. Intended for 148// use by Google-written clients. 149func (c *Client) setGoogleClientInfo(keyval ...string) { 150 kv := append([]string{"gl-go", versionGo()}, keyval...) 151 kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) 152 c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) 153} 154 155// GetOccurrence gets the specified occurrence. 156func (c *Client) GetOccurrence(ctx context.Context, req *grafeaspb.GetOccurrenceRequest, opts ...gax.CallOption) (*grafeaspb.Occurrence, error) { 157 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) 158 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 159 opts = append(c.CallOptions.GetOccurrence[0:len(c.CallOptions.GetOccurrence):len(c.CallOptions.GetOccurrence)], opts...) 160 var resp *grafeaspb.Occurrence 161 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 162 var err error 163 resp, err = c.client.GetOccurrence(ctx, req, settings.GRPC...) 164 return err 165 }, opts...) 166 if err != nil { 167 return nil, err 168 } 169 return resp, nil 170} 171 172// ListOccurrences lists occurrences for the specified project. 173func (c *Client) ListOccurrences(ctx context.Context, req *grafeaspb.ListOccurrencesRequest, opts ...gax.CallOption) *OccurrenceIterator { 174 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent())) 175 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 176 opts = append(c.CallOptions.ListOccurrences[0:len(c.CallOptions.ListOccurrences):len(c.CallOptions.ListOccurrences)], opts...) 177 it := &OccurrenceIterator{} 178 req = proto.Clone(req).(*grafeaspb.ListOccurrencesRequest) 179 it.InternalFetch = func(pageSize int, pageToken string) ([]*grafeaspb.Occurrence, string, error) { 180 var resp *grafeaspb.ListOccurrencesResponse 181 req.PageToken = pageToken 182 if pageSize > math.MaxInt32 { 183 req.PageSize = math.MaxInt32 184 } else { 185 req.PageSize = int32(pageSize) 186 } 187 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 188 var err error 189 resp, err = c.client.ListOccurrences(ctx, req, settings.GRPC...) 190 return err 191 }, opts...) 192 if err != nil { 193 return nil, "", err 194 } 195 return resp.Occurrences, resp.NextPageToken, nil 196 } 197 fetch := func(pageSize int, pageToken string) (string, error) { 198 items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) 199 if err != nil { 200 return "", err 201 } 202 it.items = append(it.items, items...) 203 return nextPageToken, nil 204 } 205 it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) 206 it.pageInfo.MaxSize = int(req.PageSize) 207 it.pageInfo.Token = req.PageToken 208 return it 209} 210 211// DeleteOccurrence deletes the specified occurrence. For example, use this method to delete an 212// occurrence when the occurrence is no longer applicable for the given 213// resource. 214func (c *Client) DeleteOccurrence(ctx context.Context, req *grafeaspb.DeleteOccurrenceRequest, opts ...gax.CallOption) error { 215 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) 216 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 217 opts = append(c.CallOptions.DeleteOccurrence[0:len(c.CallOptions.DeleteOccurrence):len(c.CallOptions.DeleteOccurrence)], opts...) 218 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 219 var err error 220 _, err = c.client.DeleteOccurrence(ctx, req, settings.GRPC...) 221 return err 222 }, opts...) 223 return err 224} 225 226// CreateOccurrence creates a new occurrence. 227func (c *Client) CreateOccurrence(ctx context.Context, req *grafeaspb.CreateOccurrenceRequest, opts ...gax.CallOption) (*grafeaspb.Occurrence, error) { 228 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent())) 229 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 230 opts = append(c.CallOptions.CreateOccurrence[0:len(c.CallOptions.CreateOccurrence):len(c.CallOptions.CreateOccurrence)], opts...) 231 var resp *grafeaspb.Occurrence 232 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 233 var err error 234 resp, err = c.client.CreateOccurrence(ctx, req, settings.GRPC...) 235 return err 236 }, opts...) 237 if err != nil { 238 return nil, err 239 } 240 return resp, nil 241} 242 243// BatchCreateOccurrences creates new occurrences in batch. 244func (c *Client) BatchCreateOccurrences(ctx context.Context, req *grafeaspb.BatchCreateOccurrencesRequest, opts ...gax.CallOption) (*grafeaspb.BatchCreateOccurrencesResponse, error) { 245 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent())) 246 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 247 opts = append(c.CallOptions.BatchCreateOccurrences[0:len(c.CallOptions.BatchCreateOccurrences):len(c.CallOptions.BatchCreateOccurrences)], opts...) 248 var resp *grafeaspb.BatchCreateOccurrencesResponse 249 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 250 var err error 251 resp, err = c.client.BatchCreateOccurrences(ctx, req, settings.GRPC...) 252 return err 253 }, opts...) 254 if err != nil { 255 return nil, err 256 } 257 return resp, nil 258} 259 260// UpdateOccurrence updates the specified occurrence. 261func (c *Client) UpdateOccurrence(ctx context.Context, req *grafeaspb.UpdateOccurrenceRequest, opts ...gax.CallOption) (*grafeaspb.Occurrence, error) { 262 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) 263 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 264 opts = append(c.CallOptions.UpdateOccurrence[0:len(c.CallOptions.UpdateOccurrence):len(c.CallOptions.UpdateOccurrence)], opts...) 265 var resp *grafeaspb.Occurrence 266 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 267 var err error 268 resp, err = c.client.UpdateOccurrence(ctx, req, settings.GRPC...) 269 return err 270 }, opts...) 271 if err != nil { 272 return nil, err 273 } 274 return resp, nil 275} 276 277// GetOccurrenceNote gets the note attached to the specified occurrence. Consumer projects can 278// use this method to get a note that belongs to a provider project. 279func (c *Client) GetOccurrenceNote(ctx context.Context, req *grafeaspb.GetOccurrenceNoteRequest, opts ...gax.CallOption) (*grafeaspb.Note, error) { 280 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) 281 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 282 opts = append(c.CallOptions.GetOccurrenceNote[0:len(c.CallOptions.GetOccurrenceNote):len(c.CallOptions.GetOccurrenceNote)], opts...) 283 var resp *grafeaspb.Note 284 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 285 var err error 286 resp, err = c.client.GetOccurrenceNote(ctx, req, settings.GRPC...) 287 return err 288 }, opts...) 289 if err != nil { 290 return nil, err 291 } 292 return resp, nil 293} 294 295// GetNote gets the specified note. 296func (c *Client) GetNote(ctx context.Context, req *grafeaspb.GetNoteRequest, opts ...gax.CallOption) (*grafeaspb.Note, error) { 297 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) 298 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 299 opts = append(c.CallOptions.GetNote[0:len(c.CallOptions.GetNote):len(c.CallOptions.GetNote)], opts...) 300 var resp *grafeaspb.Note 301 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 302 var err error 303 resp, err = c.client.GetNote(ctx, req, settings.GRPC...) 304 return err 305 }, opts...) 306 if err != nil { 307 return nil, err 308 } 309 return resp, nil 310} 311 312// ListNotes lists notes for the specified project. 313func (c *Client) ListNotes(ctx context.Context, req *grafeaspb.ListNotesRequest, opts ...gax.CallOption) *NoteIterator { 314 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent())) 315 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 316 opts = append(c.CallOptions.ListNotes[0:len(c.CallOptions.ListNotes):len(c.CallOptions.ListNotes)], opts...) 317 it := &NoteIterator{} 318 req = proto.Clone(req).(*grafeaspb.ListNotesRequest) 319 it.InternalFetch = func(pageSize int, pageToken string) ([]*grafeaspb.Note, string, error) { 320 var resp *grafeaspb.ListNotesResponse 321 req.PageToken = pageToken 322 if pageSize > math.MaxInt32 { 323 req.PageSize = math.MaxInt32 324 } else { 325 req.PageSize = int32(pageSize) 326 } 327 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 328 var err error 329 resp, err = c.client.ListNotes(ctx, req, settings.GRPC...) 330 return err 331 }, opts...) 332 if err != nil { 333 return nil, "", err 334 } 335 return resp.Notes, resp.NextPageToken, nil 336 } 337 fetch := func(pageSize int, pageToken string) (string, error) { 338 items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) 339 if err != nil { 340 return "", err 341 } 342 it.items = append(it.items, items...) 343 return nextPageToken, nil 344 } 345 it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) 346 it.pageInfo.MaxSize = int(req.PageSize) 347 it.pageInfo.Token = req.PageToken 348 return it 349} 350 351// DeleteNote deletes the specified note. 352func (c *Client) DeleteNote(ctx context.Context, req *grafeaspb.DeleteNoteRequest, opts ...gax.CallOption) error { 353 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) 354 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 355 opts = append(c.CallOptions.DeleteNote[0:len(c.CallOptions.DeleteNote):len(c.CallOptions.DeleteNote)], opts...) 356 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 357 var err error 358 _, err = c.client.DeleteNote(ctx, req, settings.GRPC...) 359 return err 360 }, opts...) 361 return err 362} 363 364// CreateNote creates a new note. 365func (c *Client) CreateNote(ctx context.Context, req *grafeaspb.CreateNoteRequest, opts ...gax.CallOption) (*grafeaspb.Note, error) { 366 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent())) 367 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 368 opts = append(c.CallOptions.CreateNote[0:len(c.CallOptions.CreateNote):len(c.CallOptions.CreateNote)], opts...) 369 var resp *grafeaspb.Note 370 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 371 var err error 372 resp, err = c.client.CreateNote(ctx, req, settings.GRPC...) 373 return err 374 }, opts...) 375 if err != nil { 376 return nil, err 377 } 378 return resp, nil 379} 380 381// BatchCreateNotes creates new notes in batch. 382func (c *Client) BatchCreateNotes(ctx context.Context, req *grafeaspb.BatchCreateNotesRequest, opts ...gax.CallOption) (*grafeaspb.BatchCreateNotesResponse, error) { 383 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent())) 384 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 385 opts = append(c.CallOptions.BatchCreateNotes[0:len(c.CallOptions.BatchCreateNotes):len(c.CallOptions.BatchCreateNotes)], opts...) 386 var resp *grafeaspb.BatchCreateNotesResponse 387 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 388 var err error 389 resp, err = c.client.BatchCreateNotes(ctx, req, settings.GRPC...) 390 return err 391 }, opts...) 392 if err != nil { 393 return nil, err 394 } 395 return resp, nil 396} 397 398// UpdateNote updates the specified note. 399func (c *Client) UpdateNote(ctx context.Context, req *grafeaspb.UpdateNoteRequest, opts ...gax.CallOption) (*grafeaspb.Note, error) { 400 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) 401 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 402 opts = append(c.CallOptions.UpdateNote[0:len(c.CallOptions.UpdateNote):len(c.CallOptions.UpdateNote)], opts...) 403 var resp *grafeaspb.Note 404 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 405 var err error 406 resp, err = c.client.UpdateNote(ctx, req, settings.GRPC...) 407 return err 408 }, opts...) 409 if err != nil { 410 return nil, err 411 } 412 return resp, nil 413} 414 415// ListNoteOccurrences lists occurrences referencing the specified note. Provider projects can use 416// this method to get all occurrences across consumer projects referencing the 417// specified note. 418func (c *Client) ListNoteOccurrences(ctx context.Context, req *grafeaspb.ListNoteOccurrencesRequest, opts ...gax.CallOption) *OccurrenceIterator { 419 md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) 420 ctx = insertMetadata(ctx, c.xGoogMetadata, md) 421 opts = append(c.CallOptions.ListNoteOccurrences[0:len(c.CallOptions.ListNoteOccurrences):len(c.CallOptions.ListNoteOccurrences)], opts...) 422 it := &OccurrenceIterator{} 423 req = proto.Clone(req).(*grafeaspb.ListNoteOccurrencesRequest) 424 it.InternalFetch = func(pageSize int, pageToken string) ([]*grafeaspb.Occurrence, string, error) { 425 var resp *grafeaspb.ListNoteOccurrencesResponse 426 req.PageToken = pageToken 427 if pageSize > math.MaxInt32 { 428 req.PageSize = math.MaxInt32 429 } else { 430 req.PageSize = int32(pageSize) 431 } 432 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { 433 var err error 434 resp, err = c.client.ListNoteOccurrences(ctx, req, settings.GRPC...) 435 return err 436 }, opts...) 437 if err != nil { 438 return nil, "", err 439 } 440 return resp.Occurrences, resp.NextPageToken, nil 441 } 442 fetch := func(pageSize int, pageToken string) (string, error) { 443 items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) 444 if err != nil { 445 return "", err 446 } 447 it.items = append(it.items, items...) 448 return nextPageToken, nil 449 } 450 it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) 451 it.pageInfo.MaxSize = int(req.PageSize) 452 it.pageInfo.Token = req.PageToken 453 return it 454} 455 456// NoteIterator manages a stream of *grafeaspb.Note. 457type NoteIterator struct { 458 items []*grafeaspb.Note 459 pageInfo *iterator.PageInfo 460 nextFunc func() error 461 462 // InternalFetch is for use by the Google Cloud Libraries only. 463 // It is not part of the stable interface of this package. 464 // 465 // InternalFetch returns results from a single call to the underlying RPC. 466 // The number of results is no greater than pageSize. 467 // If there are no more results, nextPageToken is empty and err is nil. 468 InternalFetch func(pageSize int, pageToken string) (results []*grafeaspb.Note, nextPageToken string, err error) 469} 470 471// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. 472func (it *NoteIterator) PageInfo() *iterator.PageInfo { 473 return it.pageInfo 474} 475 476// Next returns the next result. Its second return value is iterator.Done if there are no more 477// results. Once Next returns Done, all subsequent calls will return Done. 478func (it *NoteIterator) Next() (*grafeaspb.Note, error) { 479 var item *grafeaspb.Note 480 if err := it.nextFunc(); err != nil { 481 return item, err 482 } 483 item = it.items[0] 484 it.items = it.items[1:] 485 return item, nil 486} 487 488func (it *NoteIterator) bufLen() int { 489 return len(it.items) 490} 491 492func (it *NoteIterator) takeBuf() interface{} { 493 b := it.items 494 it.items = nil 495 return b 496} 497 498// OccurrenceIterator manages a stream of *grafeaspb.Occurrence. 499type OccurrenceIterator struct { 500 items []*grafeaspb.Occurrence 501 pageInfo *iterator.PageInfo 502 nextFunc func() error 503 504 // InternalFetch is for use by the Google Cloud Libraries only. 505 // It is not part of the stable interface of this package. 506 // 507 // InternalFetch returns results from a single call to the underlying RPC. 508 // The number of results is no greater than pageSize. 509 // If there are no more results, nextPageToken is empty and err is nil. 510 InternalFetch func(pageSize int, pageToken string) (results []*grafeaspb.Occurrence, nextPageToken string, err error) 511} 512 513// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. 514func (it *OccurrenceIterator) PageInfo() *iterator.PageInfo { 515 return it.pageInfo 516} 517 518// Next returns the next result. Its second return value is iterator.Done if there are no more 519// results. Once Next returns Done, all subsequent calls will return Done. 520func (it *OccurrenceIterator) Next() (*grafeaspb.Occurrence, error) { 521 var item *grafeaspb.Occurrence 522 if err := it.nextFunc(); err != nil { 523 return item, err 524 } 525 item = it.items[0] 526 it.items = it.items[1:] 527 return item, nil 528} 529 530func (it *OccurrenceIterator) bufLen() int { 531 return len(it.items) 532} 533 534func (it *OccurrenceIterator) takeBuf() interface{} { 535 b := it.items 536 it.items = nil 537 return b 538} 539