feat: add OptionalField

This commit is contained in:
rus07tam 2025-11-26 14:06:10 +00:00
parent 7e8b57793f
commit 36d9da10bc
3 changed files with 32 additions and 0 deletions

View file

@ -4,6 +4,7 @@ from .field import Field
from .float import FloatField from .float import FloatField
from .int import IntField from .int import IntField
from .list import ListField from .list import ListField
from .optional import OptionalField
from .str import StrField from .str import StrField
__all__ = [ __all__ = [
@ -13,5 +14,6 @@ __all__ = [
"FloatField", "FloatField",
"IntField", "IntField",
"ListField", "ListField",
"OptionalField",
"StrField", "StrField",
] ]

View file

@ -0,0 +1,28 @@
from typing import Final, TypeVar
from .field import Field
T = TypeVar("T")
class OptionalField(Field[T | None]):
def __init__(
self,
field: Field[T],
*,
none_value: bytes = b"",
) -> None:
super().__init__(None)
self.none_value: Final = none_value
self.field: Final = field
def serialize(self, value: T | None, /) -> bytes:
if value is None:
return self.none_value
return self.field.serialize(value)
def deserialize(self, serialized: bytes, /) -> T | None:
if serialized == self.none_value:
return None
return self.field.deserialize(serialized)

View file

@ -5,6 +5,7 @@ from .field import Field as field
from .float import FloatField as float from .float import FloatField as float
from .int import IntField as int from .int import IntField as int
from .list import ListField as list from .list import ListField as list
from .optional import OptionalField as optional
from .str import StrField as str from .str import StrField as str
__all__ = [ __all__ = [
@ -14,5 +15,6 @@ __all__ = [
"float", "float",
"int", "int",
"list", "list",
"optional",
"str", "str",
] ]