Saltar al contenido

17 · Schemas

Invariantes entre campos de schemas

Añade predicados where después de un schema para validar el valor completo. La conversión de campos y los valores por defecto ocurren primero. Los invariantes devuelven bool y se ejecutan en orden; los fallos producen DecodeError estructurado en la ruta del objeto.

En esta página

Añade predicados where después de un schema para validar el valor completo. La conversión de campos y los valores por defecto ocurren primero. Los invariantes devuelven bool y se ejecutan en orden; los fallos producen DecodeError estructurado en la ruta del objeto.

Ejemplo completo

Invariantes entre campos de schemas.

06-cross-field-invariants.zolo
Playground
// Item 13: field checks -> defaults -> assembled-object invariants, once each.

var trace = ""
var cleaned = 0
fn last_default() -> int { trace += "D"; 10 }
fn nonnegative(value: int) -> bool { trace += "F"; value >= 0 }
schema Booking {
    start: int where nonnegative,
    end: int = last_default(),
}
where |booking| {
    defer { cleaned += 1 }
    trace += "I"
    booking.start < booking.end
}
where |booking| { trace += "J"; booking.end <= 20 }

fn show(result: Result<Booking, DecodeError>) {
    match result {
        .Ok(booking) => print("ok:{booking.start}:{booking.end}"),
        .Err(error) => {
            print("{error.path}:{error.kind}:{error.expected}:{error.actual}:{error.message}")
            print(error.causes.len())
        },
    }
}
fn main() {
    let valid = Booking.parse(#{start: 2})
    assert(match valid { .Ok(value) => value.start == 2 && value.end == 10, .Err(_) => false })
    assert(trace == "FDIJ")
    show(valid)
    print(trace)
    trace = ""

    let invariant_failure = Booking.parse(#{start: 10, end: 1})
    assert(match invariant_failure {
        .Err(error) => error.path == "$" && error.expected == "Booking" && error.actual == "Booking"
            && error.message == "Booking: invariant 1 failed" && error.causes.len() == 0,
        .Ok(_) => false,
    })
    assert(trace == "FI")
    show(invariant_failure)
    print(trace)
    trace = ""

    let field_failure = Booking.parse(#{start: -1})
    assert(match field_failure {
        .Err(error) => error.path == "$.start" && error.message == "start: constraint failed",
        .Ok(_) => false,
    })
    assert(trace == "F")
    show(field_failure)
    print(trace)
    trace = ""

    let wrong_type = Booking.parse(#{start: 2, end: "bad"})
    assert(match wrong_type {
        .Err(error) => error.path == "$.end" && error.expected == "int" && error.actual == "string",
        .Ok(_) => false,
    })
    assert(trace == "F")
    show(wrong_type)
    print(trace)
    print(cleaned)
    assert(cleaned == 2)
}

Reglas y comportamiento

Validación, esquemas y unidades · Documentación

Desde un checkout del repositorio:

zolo examples/features/23-schemas/06-cross-field-invariants.zolo

Índice global

Encuentra tu camino por Zolo

Prueba una idea

Empieza aquí

9 resultados

9 resultados

enespt-br