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

1from decimal import Decimal, InvalidOperation 

2 

3from .types import Number 

4 

5 

6def _cast_to_decimal(value: Number) -> Decimal: 

7 if isinstance(value, Decimal): 

8 return value 

9 

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 

15 

16 return result 

17 

18 

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) 

27 

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) 

33 

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) 

39 

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) 

45 

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) 

51 

52 return result