package actions

import "time"

// GuardedWriteTimeout bounds one remote write while the Pool ownership lock is
// held. The takeover lock waits longer, so Delete can make progress after a
// dependency stops responding.
const GuardedWriteTimeout = 45 * time.Second

type guardedAction struct {
	action Action
	guard  ActionGuard
}

func GuardAction(action Action, guard ActionGuard) Action {
	return &guardedAction{action: action, guard: guard}
}

func (a *guardedAction) Name() string { return a.action.Name() }

func (a *guardedAction) Invoke(args ActionArgs) error {
	return a.guard(args, func() error { return a.action.Invoke(args) })
}

func (a *guardedAction) CloneAction() Action {
	inner := a.action
	if cloneable, ok := inner.(interface{ CloneAction() Action }); ok {
		inner = cloneable.CloneAction()
	}
	return &guardedAction{action: inner, guard: a.guard}
}

func (a *guardedAction) TryAbort() bool { return TryAbortAction(a.action) }
