-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig_field.py
More file actions
40 lines (33 loc) · 1.33 KB
/
config_field.py
File metadata and controls
40 lines (33 loc) · 1.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from typing import Any, Generic, TypeVar
from .exceptions import ConfigFieldUndefinedValueError, ConfigFieldValidationError
from .getter import IConfigValueGetter, UndefinedValueError
from .validator import IValidator, ValidationError
ValueType = TypeVar("ValueType")
class TConfigField(Generic[ValueType]):
"""
Self-describing field object that encapsulates:
- Getting value (getter)
- Validating value (validator)
- Field metadata (name, allowed_values)
- Error handling
"""
def __init__(
self,
name: str,
getter: IConfigValueGetter,
validator: IValidator[ValueType],
allowed_values_description: str,
):
self._name: str = name
self._getter: IConfigValueGetter = getter
self._validator: IValidator[ValueType] = validator
self._allowed_values_description: str = allowed_values_description
def get(self) -> ValueType:
try:
raw_value: Any = self._getter()
except UndefinedValueError as e:
raise ConfigFieldUndefinedValueError.from_undefined_value_error(e, self._allowed_values_description)
try:
return self._validator(raw_value)
except ValidationError as e:
raise ConfigFieldValidationError.from_validation_error(e, self._name, self._allowed_values_description)