Unions
Handling multiple possible schemas.
Unions
Unions allow a value to match one of several possible schemas.
Standard Unions
Standard unions try each schema sequentially. The first one that succeeds is returned.
use rod_rs::union;
let schema = union(vec![
Box::new(string()),
Box::new(number())
]);import { rod } from 'rod-js';
const schema = rod.union([
rod.string(),
rod.number()
]);import rod
schema = rod.union(
rod.string(),
rod.number()
)Discriminated Unions
For objects sharing a common "tag" or "type" field, Discriminated Unions provide $O(1)$ performance by jumping directly to the correct validator.
use rod_rs::discriminated_union;
let circle = rod_obj! { type: literal("circle"), radius: number() };
let square = rod_obj! { type: literal("square"), side: number() };
let schema = discriminated_union("type", vec![
("circle", Box::new(circle)),
("square", Box::new(square))
]);import { rod } from 'rod-js';
const circle = rod.object({ type: rod.literal("circle"), radius: rod.number() });
const square = rod.object({ type: rod.literal("square"), side: rod.number() });
const schema = rod.discriminatedUnion("type", [circle, square]);import rod
circle = rod.object({ "type": rod.literal("circle"), "radius": rod.number() })
square = rod.object({ "type": rod.literal("square"), "side": rod.number() })
schema = rod.discriminated_union("type", [circle, square])