| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- package firestore
- import (
- "context"
- "errors"
- fs "cloud.google.com/go/firestore"
- "github.com/kellegous/go/internal"
- "google.golang.org/api/iterator"
- )
- // RouteIterator allows iteration of the named routes in firestore.
- type RouteIterator struct {
- ctx context.Context
- db *fs.Client
- it *fs.DocumentIterator
- doc *fs.DocumentSnapshot
- err error
- }
- // Valid indicates whether the current values of the iterator are valid.
- func (i *RouteIterator) Valid() bool {
- return i.db != nil && i.it != nil && i.doc != nil && i.err == nil
- }
- // Next advances the iterator to the next value.
- func (i *RouteIterator) Next() bool {
- doc, err := i.it.Next()
- if err != nil {
- if errors.Is(err, iterator.Done) {
- i.doc = nil
- } else {
- i.err = err
- }
- return false
- }
- i.doc = doc
- return true
- }
- // Seek ...
- func (i *RouteIterator) Seek(cur string) bool {
- // firestore makes this a little hard. Make a whole new
- // document iterator that starts at a new spot.
- i.it = i.db.Collection("routes").OrderBy(fs.DocumentID, fs.Asc).StartAt(cur).Documents(i.ctx)
- doc, err := i.it.Next()
- if err != nil {
- i.err = err
- i.doc = nil
- return false
- }
- i.doc = doc
- return true
- }
- // Error returns any active error that has stopped the iterator.
- func (i *RouteIterator) Error() error {
- return i.err
- }
- // Name is the name of the current route.
- func (i *RouteIterator) Name() string {
- return i.doc.Ref.ID
- }
- // Route is the current route.
- func (i *RouteIterator) Route() *internal.Route {
- var rt internal.Route
- if err := i.doc.DataTo(&rt); err != nil {
- i.err = err
- return nil
- }
- return &rt
- }
- // Release disposes of the resources in the iterator.
- func (i *RouteIterator) Release() {
- i.it.Stop()
- i.doc = nil
- i.err = nil
- }
|