from abc import ABC from typing import Type, Any from marshmallow import ValidationError from apollo_utils.core.utils.ext_enum import ExtEnum class EnumFieldMixin(ABC): """Mixin to use with different marshmallow fields classes.""" def __init__(self, enum: Type[ExtEnum], *args, load_as: str = None, **kwargs): self._enum = enum if load_as and load_as not in ("name", "value"): raise ValueError(f"'load_as' available values are 'name', 'value', but {load_as} was passed.") self._load_as = load_as super().__init__(*args, **kwargs) def _deserialize(self, value, attr, data, **kwargs) -> Any: value = super()._deserialize(value, attr, data, **kwargs) try: value = self._enum(value) if self._load_as: value = getattr(value, self._load_as) return value except ValueError: raise ValidationError(f"Not a valid value, allowed: {', '.join(self._enum.values())}")