64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
)
|
|
|
|
type WalkEmitter struct {
|
|
ctx context.Context
|
|
backend string
|
|
opts WalkOptions
|
|
fn WalkFunc
|
|
count int
|
|
}
|
|
|
|
func NewWalkEmitter(ctx context.Context, backend string, opts WalkOptions, fn WalkFunc) *WalkEmitter {
|
|
return &WalkEmitter{
|
|
ctx: ctx,
|
|
backend: backend,
|
|
opts: opts,
|
|
fn: fn,
|
|
}
|
|
}
|
|
|
|
func (e *WalkEmitter) Emit(entry Entry) error {
|
|
if err := e.ctx.Err(); err != nil {
|
|
return err
|
|
}
|
|
if e.opts.Limit > 0 && e.count >= e.opts.Limit {
|
|
return ErrStopWalk
|
|
}
|
|
e.count++
|
|
if err := e.fn(entry); err != nil {
|
|
if errors.Is(err, ErrStopWalk) {
|
|
return ErrStopWalk
|
|
}
|
|
return NewError(OpWalk, e.backend, entry.Path, ErrUnknown, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e *WalkEmitter) LimitReached() bool {
|
|
return e.opts.Limit > 0 && e.count >= e.opts.Limit
|
|
}
|
|
|
|
func FinishWalk(err error) error {
|
|
if errors.Is(err, ErrStopWalk) {
|
|
return nil
|
|
}
|
|
return err
|
|
}
|
|
|
|
func HasAny(ctx context.Context, backend Backend, prefix string) (bool, error) {
|
|
found := false
|
|
err := backend.Walk(ctx, prefix, WalkOptions{Recursive: false, Limit: 1}, func(Entry) error {
|
|
found = true
|
|
return ErrStopWalk
|
|
})
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return found, nil
|
|
}
|