Type safe validation of arbitrary data
Provides the Valid<T> struct which wraps some data, after verifiying that it meets some
criteria:
# use validity::*;
#[derive(Debug)]
struct PhoneNumber(String);
enum InvalidPhoneNumber {
NonDigit,
WrongLength,
}
impl Validate for PhoneNumber {
type Error = InvalidPhoneNumber;
fn is_valid(&self) -> Result<(), Self::Error> {
if self.0.len() == 11 {
return Err(InvalidPhoneNumber::WrongLength);
}
if self.0.chars().any(|c| !c.is_digit(10)) {
return Err(InvalidPhoneNumber::NonDigit);
}
Ok(())
}
}
fn main() {
let number = PhoneNumber("01234567890".to_string());
if let Ok(number) = number.validate() {
handle_phone_number(number);
} else {
println!("error!");
}
}
fn handle_phone_number(number: Valid<PhoneNumber>) {
println!("This is a definitely valid phone number: {:?}", number.into_inner());
}