package cluster

import "errors"

type stepFailure struct {
	err       error
	transient bool
}

func (e *stepFailure) Error() string { return e.err.Error() }
func (e *stepFailure) Unwrap() error { return e.err }

// Transient marks an error as retryable within the configured budget.
func Transient(err error) error {
	if err == nil {
		return nil
	}
	return &stepFailure{err: err, transient: true}
}

func isTransientError(err error) bool {
	var stepErr *stepFailure
	return errors.As(err, &stepErr) && stepErr.transient
}

func unwrapStepError(err error) error {
	var stepErr *stepFailure
	if errors.As(err, &stepErr) {
		return stepErr.err
	}
	return err
}

func (p RetryPolicy) budgetFor(step StepName) int {
	if p.ByStep != nil {
		if budget, ok := p.ByStep[step]; ok && budget > 0 {
			return budget
		}
	}
	return 1
}
