| 47 | |
| 48 | |
| 49 | def _timedelta_from_secs( |
| 50 | value: float | timedelta | Any | None, |
| 51 | handler: Callable[[Any], timedelta], |
| 52 | ) -> timedelta | None: |
| 53 | if value == float('inf'): |
| 54 | return timedelta.max |
| 55 | |
| 56 | # If the value is a string-encoded number, decode it |
| 57 | if isinstance(value, str): |
| 58 | with suppress(ValidationError): |
| 59 | value = _number_parser.validate_python(value) |
| 60 | |
| 61 | if not isinstance(value, (int, float)): |
| 62 | return handler(value) |
| 63 | |
| 64 | return timedelta(seconds=value) |
| 65 | |
| 66 | |
| 67 | timedelta_ms = Annotated[timedelta, PlainSerializer(_timedelta_to_ms), WrapValidator(_timedelta_from_ms)] |