| 335 | |
| 336 | |
| 337 | def _decimal_parts(value: decimal.Decimal) -> Tuple[int, int]: |
| 338 | if not value.is_finite(): |
| 339 | raise ValueError(f"Decimal value must be finite, got {value!r}") |
| 340 | sign, digits, exponent = value.as_tuple() |
| 341 | scale = -exponent |
| 342 | if scale < _MIN_INT32 or scale > _MAX_INT32: |
| 343 | raise ValueError(f"Decimal scale {scale} is outside signed Int32 range") |
| 344 | unscaled = 0 |
| 345 | for digit in digits: |
| 346 | unscaled = unscaled * 10 + digit |
| 347 | if sign: |
| 348 | unscaled = -unscaled |
| 349 | return scale, unscaled |
| 350 | |
| 351 | |
| 352 | def _decimal_from_parts(scale: int, unscaled: int) -> decimal.Decimal: |