|
from typing import Mapping |
|
|
|
from .base import Loader, CAPTURE_EXCEPTIONS, ILoaderClass |
|
from .exception import CompositeStructureError |
|
|
|
DICT_ERRORS = Mapping[str, Exception] |
|
|
|
|
|
class DictError(CompositeStructureError): |
|
""" |
|
Overview: |
|
Dict error. |
|
Interfaces: |
|
``__init__``, ``errors`` |
|
Properties: |
|
``errors`` |
|
""" |
|
|
|
def __init__(self, errors: DICT_ERRORS): |
|
""" |
|
Overview: |
|
Initialize the DictError. |
|
Arguments: |
|
- errors (:obj:`DICT_ERRORS`): The errors. |
|
""" |
|
|
|
self.__error = errors |
|
|
|
@property |
|
def errors(self) -> DICT_ERRORS: |
|
""" |
|
Overview: |
|
Get the errors. |
|
""" |
|
|
|
return self.__error |
|
|
|
|
|
def dict_(**kwargs) -> ILoaderClass: |
|
""" |
|
Overview: |
|
Create a dict loader. |
|
Arguments: |
|
- kwargs (:obj:`Mapping[str, ILoaderClass]`): The loaders. |
|
""" |
|
|
|
kwargs = [(k, Loader(v)) for k, v in kwargs.items()] |
|
|
|
def _load(value): |
|
_errors = {} |
|
_results = {} |
|
|
|
for k, vl in kwargs: |
|
try: |
|
v = vl(value) |
|
except CAPTURE_EXCEPTIONS as err: |
|
_errors[k] = err |
|
else: |
|
_results[k] = v |
|
|
|
if not _errors: |
|
return _results |
|
else: |
|
raise DictError(_errors) |
|
|
|
return Loader(_load) |
|
|