Biryani Design
Features
- Procedural, not declarative: Every converter is a function.
- Bad input isn’t exceptional: Converters don’t raise exceptions they return a couple (value, error).
- No value is not a value: When a converter is called with None it does nothing since it has no value to convert and returns (None, None).
- No magic: No decorator, no metaclass, no class, ..., nothing but simple functions.
- Once again: No class. No attribute to define, no method to override, no instance to create.
- No symmetry: A conversion from A to B is not handled by the same converter as a conversion from B to A.
- Lean and mean: Each converter does only one thing. To do more, combine converters.
- Easy combination: Every converter can be combined with any other converters.
- Homogeneity: Every converter has the same signature (input: the value and an optional context, output: a couple (converted value, error)).
- Extensibility: Creating a converter means just writing a new function with the same signature.
Consequences
- Using a converter is just calling a function.
- Creating a new converter is easy.
- But combining existing converters is even easier.
- Mixing converters with Python code is as easy.
- Converters enhancements are incremental.
- Biryani can be used to validate and/or convert anything to anything (HTML forms, CSV files, XML files, etc).