armature_validation/
traits.rs

1// Validation traits
2
3use crate::ValidationError;
4use async_trait::async_trait;
5
6/// Trait for validatable types
7pub trait Validate {
8    /// Validate the value and return errors if any
9    fn validate(&self) -> Result<(), Vec<ValidationError>>;
10}
11
12/// Trait for async validatable types
13#[async_trait]
14pub trait AsyncValidate {
15    /// Async validation (e.g., database checks)
16    async fn validate_async(&self) -> Result<(), Vec<ValidationError>>;
17}
18
19/// Trait for custom validators
20pub trait Validator: Send + Sync {
21    /// Validate a value
22    fn validate(&self, value: &dyn std::any::Any, field: &str) -> Result<(), ValidationError>;
23
24    /// Get validator name
25    fn name(&self) -> &'static str;
26}
27
28/// Trait for async validators
29#[async_trait]
30pub trait AsyncValidator: Send + Sync {
31    /// Async validate a value
32    async fn validate_async(
33        &self,
34        value: &dyn std::any::Any,
35        field: &str,
36    ) -> Result<(), ValidationError>;
37
38    /// Get validator name
39    fn name(&self) -> &'static str;
40}
41
42/// Validation context for additional data
43#[derive(Debug, Clone)]
44pub struct ValidationContext {
45    /// Request data or additional context
46    pub data: std::collections::HashMap<String, String>,
47}
48
49impl ValidationContext {
50    /// Create a new validation context
51    pub fn new() -> Self {
52        Self {
53            data: std::collections::HashMap::new(),
54        }
55    }
56
57    /// Add context data
58    pub fn with_data(mut self, key: String, value: String) -> Self {
59        self.data.insert(key, value);
60        self
61    }
62
63    /// Get context data
64    pub fn get(&self, key: &str) -> Option<&String> {
65        self.data.get(key)
66    }
67}
68
69impl Default for ValidationContext {
70    fn default() -> Self {
71        Self::new()
72    }
73}