The following actions all work with user-defined types:
- user-defined types can be created
- a validator for a user-defined type can be defined
- a validator for a user-defined type can be implemented
- validators can call the default validator for some of the validation, and then add more validation on top of it (e.g. use the default validator to make sure all keys are there and have the right type, and then use a bespoke checker to make sure that a specific key's value follows additional rules)
- an instance of a user-defined type can be created
- a user-defined type has a working UX to be entered, displayed, and changed
- validators run on instances
- instances which should fail, fail at validation and do not get saved
- instances which should fail cause an exception when being created programmatically
- users can define bespoke error types for validation
- users can raise bespoke error types when validation fails
- functions with user-defined types as input or output types can be defined and implemented
- user-defined types are displayed with a default component
- user-defined types can be entered using a default input component
- support de/serialization for user defined types