@@ -17,6 +17,14 @@ def _timedelta_to_ms(td: timedelta | None) -> float | None:
1717 return int (round (td .total_seconds () * 1000 ))
1818
1919
20+ def _timedelta_to_secs (td : timedelta | None ) -> float | None :
21+ if td == timedelta .max :
22+ return float ('inf' )
23+ if td is None :
24+ return td
25+ return td .total_seconds ()
26+
27+
2028_number_parser = TypeAdapter (float )
2129
2230
@@ -35,4 +43,23 @@ def _timedelta_from_ms(value: float | timedelta | Any | None, handler: Callable[
3543 return timedelta (milliseconds = value )
3644
3745
46+ def _timedelta_from_secs (
47+ value : float | timedelta | Any | None ,
48+ handler : Callable [[Any ], timedelta ],
49+ ) -> timedelta | None :
50+ if value == float ('inf' ):
51+ return timedelta .max
52+
53+ # If the value is a string-encoded number, decode it
54+ if isinstance (value , str ):
55+ with suppress (ValidationError ):
56+ value = _number_parser .validate_python (value )
57+
58+ if not isinstance (value , (int , float )):
59+ return handler (value )
60+
61+ return timedelta (seconds = value )
62+
63+
3864timedelta_ms = Annotated [timedelta , PlainSerializer (_timedelta_to_ms ), WrapValidator (_timedelta_from_ms )]
65+ timedelta_secs = Annotated [timedelta , PlainSerializer (_timedelta_to_secs ), WrapValidator (_timedelta_from_secs )]
0 commit comments