timer_duration.pony

use "constrained_types"

primitive TimerDurationValidator is Validator[U64]
  """
  Validates that a timer duration is within the allowed range.

  The minimum value is 1 millisecond. The maximum value is
  18,446,744,073,709 milliseconds (~213,503 days) — the largest value
  that can be converted to nanoseconds without overflowing U64.

  Used by `MakeTimerDuration` to construct `TimerDuration` values.
  """
  fun apply(value: U64): ValidationResult =>
    if value == 0 then
      recover val
        ValidationFailure(
          "timer duration must be greater than zero")
      end
    elseif value > _max_millis() then
      recover val
        ValidationFailure(
          "timer duration must be at most " +
            _max_millis().string() +
            " milliseconds")
      end
    else
      ValidationSuccess
    end

  fun _max_millis(): U64 =>
    """
    The maximum timer duration in milliseconds. Values above this would
    overflow U64 when converted to nanoseconds internally.
    """
    U64.max_value() / 1_000_000

type TimerDuration is Constrained[U64, TimerDurationValidator]
  """
  A validated timer duration in milliseconds. The allowed range is
  1 to 18,446,744,073,709 milliseconds (~213,503 days). The upper bound
  ensures the value can be safely converted to nanoseconds without
  overflowing U64.

  Construct with `MakeTimerDuration(milliseconds)`, which returns
  `(TimerDuration | ValidationFailure)`. Pass to `set_timer()` to create
  a one-shot timer.
  """

type MakeTimerDuration is MakeConstrained[U64, TimerDurationValidator]
  """
  Factory for `TimerDuration` values. Returns
  `(TimerDuration | ValidationFailure)`.
  """