Restrições `where`
Nesta página
A cláusula where anexa uma closure booleana a um campo. Durante parse, cada
restrição é avaliada com o valor fornecido; se qualquer uma retornar false, o
parse inteiro falha com Result::Err. Isso centraliza as invariantes de domínio
na definição do schema — não são necessárias verificações manuais depois do
parse.
Alguns usos típicos: idades não-negativas, faixas de porta válidas, strings não-vazias, valores dentro de um conjunto permitido.
Age rejeita valores negativos; Port aceita apenas 1–65535. Ambos usam match para mostrar Ok e Err.
04-where-constraints.zolo
// 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
Desafio
Adicione um terceiro schema Percentage { value: int where |v| v >= 0 && v <= 100 }
e teste com os valores 50, 0, 100 e 101. Qual é o comportamento nos
limites da faixa?
Veja também