package store

import (
	"github.com/hashicorp/raft"
	"github.com/pkg/errors"
)

// Handler handles a single command log yielded by Iterate.
type Handler func(uint64, *raft.Log) error

// Iterate through all command logs in the given store within the given range.
func Iterate(logs raft.LogStore, r *Range, handler Handler) error {
	for index := r.First; index <= r.Last; index++ {
		log := &raft.Log{}
		if err := logs.GetLog(index, log); err != nil {
			return errors.Wrapf(err, "failed to get log %d", index)
		}

		if log.Type != raft.LogCommand {
			continue
		}

		if err := handler(index, log); err != nil {
			return err
		}
	}

	return nil
}