validity 0.1.2

A type safe wrapper for enforcing arbitrary properties at compile time
Documentation

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());
}