diff --git a/README.rst b/README.rst index 58c731b..e20d693 100644 --- a/README.rst +++ b/README.rst @@ -78,6 +78,57 @@ Usage with Flask app.run() +Adding Custom Types +################### + +There are a couple of different ways to implement new types for parsing in +pavlova. In general, the process is to add a parser a specific type. For +validation you should raise a TypeError or ValueError. + +The first one, is creating a new type that extends an existing base type. Here +is an example on how to implement an Email type, which is a string but performs +validation. + +.. code-block:: python + + from pavlova import Pavlova + from pavlova.parsers import GenericParser + + class Email(str): + def __new__(cls, input_value: typing.Any) -> str: + if isinstance(input_value, str): + if '@' in input_value: + return str(input_value) + raise ValueError() + raise TypeError() + + pavlova = Pavlova() + pavlova.register_parser(Email, GenericParser(pavlova, Email)) + +Another way, is to implement your own pavlova parser, rather than using your +the built in `GenericParser` parser. + +.. code-block:: python + + import datetime + from typing import Any, Tuple + + import dateparser + from pavlova import Pavlova + from pavlova.parsers import PavlovaParser + + class DatetimeParser(PavlovaParser[datetime.datetime]): + "Parses a datetime" + + def parse_input(self, + input_value: Any, + field_type: Type, + path: Tuple[str, ...]) -> datetime.datetime: + return dateparser.parse(input_value) + + pavlova = Pavlova() + pavlova.register_parser(datetime.DateTime, DatetimeParser(pavlova)) + Requirements ############