diff --git a/src/ahriman/models/waiter.py b/src/ahriman/models/waiter.py index 7f804315..c8de2713 100644 --- a/src/ahriman/models/waiter.py +++ b/src/ahriman/models/waiter.py @@ -27,6 +27,22 @@ from typing import ParamSpec Params = ParamSpec("Params") +@dataclass(frozen=True) +class WaiterResult: + took: float + + def __float__(self) -> float: + return self.took + + +class WaiterTimedOut(WaiterResult): + pass + + +class WaiterFinished(WaiterResult): + pass + + @dataclass(frozen=True) class Waiter: """ @@ -54,7 +70,7 @@ class Waiter: since_start: float = time.monotonic() - self.start_time return self.wait_timeout != 0 and since_start > self.wait_timeout - def wait(self, in_progress: Callable[Params, bool], *args: Params.args, **kwargs: Params.kwargs) -> float: + def wait(self, in_progress: Callable[Params, bool], *args: Params.args, **kwargs: Params.kwargs) -> WaiterResult: """ wait until requirements are not met @@ -66,7 +82,9 @@ class Waiter: Returns: float: consumed time in seconds """ - while not self.is_timed_out() and in_progress(*args, **kwargs): + while not (timed_out := self.is_timed_out()) and in_progress(*args, **kwargs): time.sleep(self.interval) - return time.monotonic() - self.start_time + if timed_out: + return WaiterTimedOut(time.monotonic() - self.start_time) + return WaiterFinished(time.monotonic() - self.start_time)