mod bytes;
mod error;
pub mod errors;
mod string;
#[doc(hidden)]
pub mod utils;
#[doc(hidden)]
pub use bytes::ValidateBytesExt;
pub use error::*;
#[doc(hidden)]
pub use string::ValidateStringExt;
#[doc(hidden)]
pub use utils::VecExt;
#[cfg(feature = "derive")]
pub use prost_validate_derive::Validator;
pub type Result<T = (), E = Error> = core::result::Result<T, E>;
pub trait Validator: Send + Sync {
fn validate(&self) -> Result {
Ok(())
}
}
#[doc(hidden)]
pub trait NoopValidator {
fn validate(&self) -> Result {
Ok(())
}
}
impl<T: ?Sized> NoopValidator for T {}
#[doc(hidden)]
pub struct SafeValidator<'a, T: ?Sized>(pub &'a T);
impl<'a, T: ?Sized + Validator> SafeValidator<'a, T> {
pub fn validate(&self) -> Result {
Validator::validate(self.0)
}
}
#[macro_export]
macro_rules! validate {
($value:tt) => {{
use ::prost_validate::NoopValidator;
use std::ops::Deref;
::prost_validate::SafeValidator($value.deref()).validate()
}};
}
#[cfg(test)]
mod tests {
pub struct A {}
impl prost_validate::Validator for A {
fn validate(&self) -> prost_validate::Result {
Err(prost_validate::Error::new(
"",
prost_validate::errors::Error::InvalidRules("failed".to_string()),
))
}
}
pub struct B {}
#[test]
fn test_validator() {
let a = &A {};
assert!(prost_validate::validate!(a).is_err());
}
#[test]
fn test_validator_double_ref() {
let a = &&A {};
assert!(prost_validate::validate!(a).is_err());
}
#[test]
fn test_non_validator() {
let b = &B {};
assert!(prost_validate::validate!(b).is_ok());
}
#[test]
fn test_scalar() {
let c = &42;
assert!(prost_validate::validate!(c).is_ok());
}
}