1use std::any::Any;
2use std::sync::Arc;
3use async_trait::async_trait;
4use mongodb::Database;
5use serde_json::Value;
6use crate::error::ValidationError;
7
8#[async_trait]
9pub trait Validator: Any+Send + Sync {
10 fn validate(&self, value: &Value) -> ValidationResult;
11
12 async fn validate_async(&self, _db: &Database, value: &Value) -> ValidationResult {
13 self.validate(value)
14 }
15
16 fn as_any(&self) -> &dyn Any;
17}
18
19
20impl<F> Validator for F
21where
22 F: Fn(&Value) -> ValidationResult+Sync+Send+ 'static
23{
24 fn validate(&self, value: &Value) -> ValidationResult {
25 self(value)
26 }
27
28 fn as_any(&self) -> &dyn Any {
29 self
30 }
31}
32
33pub type ValidationResult = Result<(), ValidationError>;