import logging
import re
from typing import Union
from .structure import SSP, SSP_2017, SSP_2024, generate
__all__ = [
"SSP",
"SSP_2017",
"SSP_2024",
"generate",
"parse",
"ssp_field",
]
log = logging.getLogger(__name__)
[docs]
def parse(value: Union[str, SSP_2017, SSP_2024]) -> Union[SSP_2017, SSP_2024]:
"""Parse `value` to a member of :data:`SSP_2017` or :data:`SSP_2024`."""
if isinstance(value, (SSP_2017, SSP_2024)):
return value
log.debug(f"Assume {value!r} is from {SSP_2017}")
if isinstance(value, str):
return SSP_2017[re.sub("SSP([12345])", r"\1", value)]
else:
return SSP_2017(value)
[docs]
class ssp_field:
"""SSP field for use in data classes."""
def __init__(self, default: Union[SSP_2017, SSP_2024]):
self._default = default
def __set_name__(self, owner, name):
self._name = "_" + name
def __get__(self, obj, type) -> Union[SSP_2017, SSP_2024]:
if obj is None:
return None # type: ignore [return-value]
try:
return obj.__dict__[self._name]
except KeyError:
return obj.__dict__.setdefault(self._name, self._default)
def __set__(self, obj, value):
if value is None:
value = self._default
setattr(obj, self._name, parse(value))