baskerville 0.3.0

Infer and validate data-type schemas in Rust.
Documentation
use crate::Validator;

#[derive(Default, Debug, Clone)]
pub struct Integer {
    pub min_value: Option<i128>,
    pub max_value: Option<i128>,
    pub leading_plus: bool,
}

impl Validator for Integer {
    fn validate(&mut self, value: &str) -> bool {
        let parsed = value.parse::<i128>();
        if let Ok(parsed) = parsed {
            self.min_value = self
                .min_value
                .map_or(Some(parsed), |min| Some(std::cmp::min(min, parsed)));
            self.max_value = self
                .max_value
                .map_or(Some(parsed), |max| Some(std::cmp::max(max, parsed)));
            self.leading_plus |= value.starts_with('+');
        }
        parsed.is_ok()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Float {
    pub min_value: Option<f64>,
    pub max_value: Option<f64>,
    pub leading_plus: bool,
    pub e_notation: bool,
}

impl Validator for Float {
    fn validate(&mut self, value: &str) -> bool {
        let parsed = value.parse::<f64>();
        if let Ok(parsed) = parsed {
            self.min_value = self
                .min_value
                .map_or(Some(parsed), |min| Some(min.min(parsed)));
            self.max_value = self
                .max_value
                .map_or(Some(parsed), |max| Some(max.max(parsed)));
            self.leading_plus |= value.starts_with('+');
            self.e_notation |= value.contains('e');
        }
        parsed.is_ok()
    }
}

#[cfg(test)]
mod test {
    use crate::{Float, Integer, Validator};

    #[test]
    fn integer() {
        let mut validator = Integer::default();
        assert!(validator.validate("2"));
        assert!(validator.validate("1"));
        assert!(!validator.validate("Ferris"));
        assert_eq!(validator.min_value, Some(1));
        assert!(validator.validate("-1"));
        assert_eq!(validator.min_value, Some(-1));
        assert_eq!(validator.max_value, Some(2));
    }

    #[test]
    fn float() {
        let mut validator = Float::default();
        assert!(validator.validate("0.1"));
        assert!(validator.validate("1.1"));
        assert_eq!(validator.min_value, Some(0.1));
        assert_eq!(validator.max_value, Some(1.1));
        assert!(validator.validate("-1"));
        assert_eq!(validator.min_value, Some(-1.0));
        assert!(!validator.validate("Ferris"));
    }
}