1use super::*;
2use std::path::PathBuf;
3
4impl<E,T> Validation<E> for &T where T: Validation<E> {
5 #[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 #[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}