from typing import Callable, Any from marshmallow import fields class CustomStringField(fields.String): """Add custom logic for deserializing string fields.""" def __init__( self, lower: bool = False, upper: bool = False, title: bool = False, action: Callable[[str], str] = None, *args, **kwargs, ): self._lower = lower self._upper = upper self._title = title self._action = action super().__init__(*args, **kwargs) def _modify_value(self, value): if value: if self._lower: return value.lower() elif self._upper: return value.upper() elif self._title: return value.title() elif self._action: return self._action(value) return value def _deserialize(self, value, attr, data, **kwargs) -> Any: value = super()._deserialize(value, attr, data, **kwargs) return self._modify_value(value) def _serialize(self, value, attr, obj, **kwargs): value = super()._serialize(value, attr, obj, **kwargs) return self._modify_value(value)