# -*- coding: utf-8 -*-
from __future__ import annotations
from numbers import Number
from .Field import Field
[docs]class Integer(Field):
def __init__(
self, *, default: int = None, value_range: range = None
) -> None:
self.default = default
self.value_range = value_range
[docs] def digest(self, value: str | Number = None) -> None:
if value is None:
return self._get_default()
else:
parsed_int = int(value)
self.check_if_in_range(parsed_int)
return parsed_int
[docs] def check_if_in_range(self, parsed_int):
if self.value_range is not None:
if parsed_int not in self.value_range:
raise ValueError(
f"Value {parsed_int} out of desired value range in {self._trace_location()}."
)
[docs]class Float(Field):
def __init__(
self,
*,
default: float = None,
min: float = None,
max: float = None,
) -> None:
self.default = default
self.min = min
self.max = max
[docs] def digest(self, value: str | Number = None) -> None:
if value is None:
return self._get_default()
else:
parsed_float = float(value)
self.check_if_in_range(parsed_float)
return parsed_float
[docs] def check_if_in_range(self, parsed_float):
if self.min is not None:
if not (self.min <= parsed_float):
raise ValueError(
f"Value {parsed_float} below expected range. (min: {self.min}) in {self._trace_location()}"
)
if self.max is not None:
if not (parsed_float <= self.max):
raise ValueError(
f"Value {parsed_float} above expected range. (max: {self.max}) in {self._trace_location()}"
)