guion/validation/
imp.rs

1use super::*;
2use std::path::PathBuf;
3
4impl<E,T> Validation<E> for &T where T: Validation<E> {
5    //type Cached = T::Cached;
6
7    #[inline]
8    fn valid(&self, v: &dyn Any) -> bool {
9        (**self).valid(v)
10    }
11}
12
13impl<E,T> Validation<E> for &mut T where T: Validation<E> {
14    //type Cached = T::Cached;
15
16    #[inline]
17    fn valid(&self, v: &dyn Any) -> bool {
18        (**self).valid(v)
19    }
20}
21impl<E,T> ValidationMut<E> for &mut T where T: ValidationMut<E> {
22    #[inline]
23    fn validate(&mut self) -> Arc<dyn Any> {
24        (**self).validate()
25    }
26}
27
28impl<E,T> Validation<E> for Box<T> where T: Validation<E> {
29    #[inline]
30    fn valid(&self, v: &dyn Any) -> bool {
31        (**self).valid(v)
32    }
33}
34impl<E,T> ValidationMut<E> for Box<T> where T: ValidationMut<E> {
35    #[inline]
36    fn validate(&mut self) -> Arc<dyn Any> {
37        (**self).validate()
38    }
39}
40
41macro_rules! impl_validation_primitives {
42    ($t:ty;$($tt:ty);+) => {
43        impl_validation_primitives!($t);
44        impl_validation_primitives!($($tt);*);
45    };
46    ($t:ty) => {
47        impl<E> Validation<E> for $t {
48            #[inline]
49            fn valid(&self, v: &dyn Any) -> bool {
50                if let Some(v) = v.downcast_ref::<Self>() {
51                    self == v
52                }else{
53                    false
54                }
55            }
56        }
57        impl<E> ValidationMut<E> for $t {
58            #[inline]
59            fn validate(&mut self) -> Arc<dyn Any> {
60                Arc::new((*self).clone())
61            }
62        }
63    }
64}
65
66impl_validation_primitives!(
67    bool;char;
68    f32;f64;
69    i8;i16;i32;i64;i128;isize;
70    u8;u16;u32;u64;u128;usize;
71    String;PathBuf
72);
73
74impl<E> Validation<E> for &str {
75    #[inline]
76    fn valid(&self, v: &dyn Any) -> bool {
77        if let Some(v) = v.downcast_ref::<String>() {
78            *self == v
79        }else{
80            false
81        }
82    }
83}
84impl<E> ValidationMut<E> for &str {
85    #[inline]
86    fn validate(&mut self) -> Arc<dyn Any> {
87        Arc::new((*self).to_owned())
88    }
89}
90
91impl<E> Validation<E> for &mut str {
92    #[inline]
93    fn valid(&self, v: &dyn Any) -> bool {
94        if let Some(v) = v.downcast_ref::<String>() {
95            *self == v
96        }else{
97            false
98        }
99    }
100}
101impl<E> ValidationMut<E> for &mut str {
102    #[inline]
103    fn validate(&mut self) -> Arc<dyn Any> {
104        Arc::new((*self).to_owned())
105    }
106}
107
108impl<E> Validation<E> for () {
109    #[inline]
110    fn valid(&self, _: &dyn Any) -> bool {
111        true
112    }
113}
114impl<E> ValidationMut<E> for () {
115    #[inline]
116    fn validate(&mut self) -> Arc<dyn Any> {
117        Arc::new(())
118    }
119}