Coverage for src \ syriantaxes \ cast.py: 76%
34 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-12 14:00 +0200
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-12 14:00 +0200
1from decimal import Decimal, InvalidOperation
3from .types import Number
6def _cast_to_decimal(value: Number) -> Decimal:
7 if isinstance(value, Decimal):
8 return value
10 try:
11 result = Decimal(value if isinstance(value, str) else str(value))
12 except InvalidOperation:
13 message = "value must be a number (float or Decimal)"
14 raise TypeError(message) from None
16 return result
19def cast_to_decimal(
20 value: Number,
21 lt: Number | None = None,
22 gt: Number | None = None,
23 lte: Number | None = None,
24 gte: Number | None = None,
25) -> Decimal:
26 result = _cast_to_decimal(value)
28 if lt is not None:
29 lt = _cast_to_decimal(lt)
30 if result < lt:
31 message = f"value must be greater than {lt}"
32 raise ValueError(message)
34 if gt is not None:
35 gt = _cast_to_decimal(gt)
36 if result > gt:
37 message = f"value must be less than {gt}"
38 raise ValueError(message)
40 if lte is not None:
41 lte = _cast_to_decimal(lte)
42 if result <= lte:
43 message = f"value must be greater than or equal to {lte}"
44 raise ValueError(message)
46 if gte is not None:
47 gte = _cast_to_decimal(gte)
48 if result >= gte:
49 message = f"value must be less than or equal to {gte}"
50 raise ValueError(message)
52 return result