Rod

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])

On this page