baskerville 0.3.0

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

#[cfg(feature = "python")]
use pyo3::prelude::*;

pub mod nullable;
pub mod numeric;
pub mod text;
#[cfg(feature = "time")]
pub mod time;
pub mod unique;
#[cfg(feature = "time")]
pub use time::{Date, DateTime, Time};

pub use nullable::Empty;
pub use numeric::{Float, Integer};
pub use text::{Literal, Text};
pub use unique::Unique;

pub trait Validator: std::fmt::Debug {
    fn validate(&mut self, value: &str) -> bool;
}

#[cfg(feature = "python")]
impl Validator for PyObject {
    fn validate(&mut self, value: &str) -> bool {
        Python::with_gil(|py| self.call1(py, (value,)).unwrap().extract(py).unwrap())
    }
}

#[derive(Debug, Clone, Validator)]
pub enum DataType {
    Text(Text),
    Integer(Integer),
    Float(Float),
    Empty(Empty),
    Literal(Literal),
    Unique(Unique),
    #[cfg(feature = "time")]
    Date(Date),
    #[cfg(feature = "time")]
    Time(Time),
    #[cfg(feature = "time")]
    DateTime(DateTime),
    #[cfg(feature = "python")]
    Py(PyObject),
}