-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathresponse.rs
112 lines (100 loc) · 3.67 KB
/
response.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
use crate::resp::{BulkString, Value};
use serde::de::DeserializeOwned;
use smallvec::SmallVec;
use std::{
collections::{BTreeMap, BTreeSet, HashMap, HashSet},
hash::{BuildHasher, Hash},
};
/// Marker for a RESP Response
pub trait Response {}
impl<T> Response for T where T: DeserializeOwned {}
/// Marker for a primitive response
pub trait PrimitiveResponse: Response {}
impl PrimitiveResponse for Value {}
impl PrimitiveResponse for () {}
impl PrimitiveResponse for i8 {}
impl PrimitiveResponse for u16 {}
impl PrimitiveResponse for i16 {}
impl PrimitiveResponse for u32 {}
impl PrimitiveResponse for i32 {}
impl PrimitiveResponse for u64 {}
impl PrimitiveResponse for i64 {}
impl PrimitiveResponse for usize {}
impl PrimitiveResponse for isize {}
impl PrimitiveResponse for f32 {}
impl PrimitiveResponse for f64 {}
impl PrimitiveResponse for bool {}
impl PrimitiveResponse for String {}
impl PrimitiveResponse for BulkString {}
impl<T: PrimitiveResponse + DeserializeOwned> PrimitiveResponse for Option<T> {}
/// Marker for a collection response
pub trait CollectionResponse<T>: Response
where
T: Response + DeserializeOwned,
{
}
impl<T> CollectionResponse<T> for () where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 2] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 3] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 4] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 5] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 6] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 7] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 8] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 9] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 10] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 11] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 12] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 13] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 14] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for [T; 15] where T: Response + DeserializeOwned {}
impl<T> CollectionResponse<T> for Vec<T> where T: Response + DeserializeOwned {}
impl<T, A> CollectionResponse<T> for SmallVec<A>
where
A: smallvec::Array<Item = T>,
T: Response + DeserializeOwned,
{
}
impl<T, S: BuildHasher + Default> CollectionResponse<T> for HashSet<T, S> where
T: Response + Eq + Hash + DeserializeOwned
{
}
impl<T> CollectionResponse<T> for BTreeSet<T> where T: Response + Ord + DeserializeOwned {}
/// Marker for key/value collection response
pub trait KeyValueCollectionResponse<K, V>: Response
where
K: PrimitiveResponse,
V: Response,
{
}
impl<K, V> KeyValueCollectionResponse<K, V> for ()
where
K: PrimitiveResponse,
V: Response,
{
}
impl<K, V> KeyValueCollectionResponse<K, V> for Vec<(K, V)>
where
K: PrimitiveResponse + DeserializeOwned,
V: Response + DeserializeOwned,
{
}
impl<K, V, A> KeyValueCollectionResponse<K, V> for SmallVec<A>
where
A: smallvec::Array<Item = (K, V)>,
K: PrimitiveResponse + DeserializeOwned,
V: Response + DeserializeOwned,
{
}
impl<K, V, S: BuildHasher + Default> KeyValueCollectionResponse<K, V> for HashMap<K, V, S>
where
K: PrimitiveResponse + Eq + Hash + DeserializeOwned,
V: Response + DeserializeOwned,
{
}
impl<K, V> KeyValueCollectionResponse<K, V> for BTreeMap<K, V>
where
K: PrimitiveResponse + Ord + DeserializeOwned,
V: Response + DeserializeOwned,
{
}