Saltar al contenido

Restricciones `where`

En esta página

La cláusula where adjunta una closure booleana a un campo. Durante parse, cada restricción se evalúa con el valor proporcionado; si alguna devuelve false, el parse completo falla con Result::Err. Esto centraliza las invariantes de dominio en la definición del schema — no son necesarias verificaciones manuales después del parse.

Algunos usos típicos: edades no negativas, rangos de puerto válidos, strings no vacíos, valores dentro de un conjunto permitido.

Age rechaza valores negativos; Port acepta solo 1–65535. Ambos usan match para mostrar Ok y Err.

04-where-constraints.zolo
Playground
// Feature: schema field constraints — `field: T where |v| <bool expr>`

// Syntax: `where` takes a closure returning bool; on parse, false

// means the value is rejected as `Result::Err(message)`.

// When to use: domain invariants — non-negative ages, port ranges,

// non-empty strings. Cleaner than parse-then-check.


schema Age {
  value: int where |v| v >= 0,
}

// Valid value passes the constraint.

match Age.parse(#{value: 25}) {
  Result::Ok(a) => print(a.value),
  Result::Err(_) => print("?"),
}

// expected: 25


// A negative value fails.

match Age.parse(#{value: -1}) {
  Result::Ok(_) => print("?"),
  Result::Err(_) => print("constraint failed"),
}

// expected: constraint failed


// Multi-field schema: each `where` is checked independently.

schema Port {
  value: int where |v| v > 0 && v < 65536,
}

match Port.parse(#{value: 8080}) {
  Result::Ok(p) => print("port: {p.value}"),
  Result::Err(_) => print("?"),
}

// expected: port: 8080


match Port.parse(#{value: 99999}) {
  Result::Ok(_) => print("?"),
  Result::Err(_) => print("invalid port"),
}
// expected: invalid port

Desafío

Añade un tercer schema Percentage { value: int where |v| v >= 0 && v <= 100 } y pruébalo con los valores 50, 0, 100 y 101. ¿Cuál es el comportamiento en los límites del rango?

Buscar en Zolo

9 resultados

enespt-br