Unions
The UnionType
paired with
SchemaType::Union
can be used to represent a list of heterogeneous schema types (variants), in which a value must
match one or more of the types.
#![allow(unused)] fn main() { use schematic::{Schematic, Schema, SchemaBuilder, SchemaType, schema::{UnionType, UnionOperator}}; impl Schematic for T { fn build_schema(mut schema: SchemaBuilder) -> Schema { schema.union(UnionType { operator: UnionOperator::AnyOf, variants_types: vec![ Box::new(schema.infer::<String>()), Box::new(schema.infer::<bool>()), Box::new(schema.nest().integer(IntegerType::new_kind(IntegerKind::U32))), ], ..UnionType::default() }) } } }
If you’re only defining the variants_types
field, you can use the shorthand
UnionType::new_any()
(any of) or
UnionType::new_one()
(one of) methods. When using this approach, the Box
s are automatically inserted for you.
#![allow(unused)] fn main() { // Any of schema.union(UnionType::new_any([ schema.infer::<String>(), schema.infer::<bool>(), schema.nest().integer(IntegerType::new_kind(IntegerKind::U32)), ])); // One of schema.union(UnionType::new_one([ // ... ])); }
Operators
Unions support 2 kinds of operators, any of and one of, both of which can be defined with the
operator
field.
- Any of requires the value to match any of the variants.
- One of requires the value to match only one of the variants.
#![allow(unused)] fn main() { UnionType { // ... operator: UnionOperator::OneOf, } }