@@ -1536,6 +1536,22 @@ impl<T: ToRedisArgs + Hash + Eq, S: BuildHasher + Default> ToRedisArgs
1536
1536
}
1537
1537
}
1538
1538
1539
+ #[ cfg( feature = "hashbrown" ) ]
1540
+ impl < T : ToRedisArgs + Hash + Eq , S : BuildHasher + Default > ToRedisArgs
1541
+ for hashbrown:: HashSet < T , S >
1542
+ {
1543
+ fn write_redis_args < W > ( & self , out : & mut W )
1544
+ where
1545
+ W : ?Sized + RedisWrite ,
1546
+ {
1547
+ ToRedisArgs :: make_arg_iter_ref ( self . iter ( ) , out)
1548
+ }
1549
+
1550
+ fn num_of_args ( & self ) -> usize {
1551
+ self . len ( )
1552
+ }
1553
+ }
1554
+
1539
1555
/// @note: Redis cannot store empty sets so the application has to
1540
1556
/// check whether the set is empty and if so, not attempt to use that
1541
1557
/// result
@@ -1612,6 +1628,25 @@ impl<T: ToRedisArgs + Hash + Eq + Ord, V: ToRedisArgs> ToRedisArgs
1612
1628
}
1613
1629
}
1614
1630
1631
+ #[ cfg( feature = "hashbrown" ) ]
1632
+ impl < T : ToRedisArgs + Hash + Eq + Ord , V : ToRedisArgs > ToRedisArgs for hashbrown:: HashMap < T , V > {
1633
+ fn write_redis_args < W > ( & self , out : & mut W )
1634
+ where
1635
+ W : ?Sized + RedisWrite ,
1636
+ {
1637
+ for ( key, value) in self {
1638
+ assert ! ( key. num_of_args( ) <= 1 && value. num_of_args( ) <= 1 ) ;
1639
+
1640
+ key. write_redis_args ( out) ;
1641
+ value. write_redis_args ( out) ;
1642
+ }
1643
+ }
1644
+
1645
+ fn num_of_args ( & self ) -> usize {
1646
+ self . len ( )
1647
+ }
1648
+ }
1649
+
1615
1650
macro_rules! to_redis_args_for_tuple {
1616
1651
( ) => ( ) ;
1617
1652
( $( $name: ident, ) +) => (
@@ -2105,6 +2140,36 @@ impl<K: FromRedisValue + Eq + Hash, V: FromRedisValue, S: BuildHasher + Default>
2105
2140
}
2106
2141
}
2107
2142
2143
+ #[ cfg( feature = "hashbrown" ) ]
2144
+ impl < K : FromRedisValue + Eq + Hash , V : FromRedisValue , S : BuildHasher + Default > FromRedisValue
2145
+ for hashbrown:: HashMap < K , V , S >
2146
+ {
2147
+ fn from_redis_value ( v : & Value ) -> RedisResult < hashbrown:: HashMap < K , V , S > > {
2148
+ let v = get_inner_value ( v) ;
2149
+ match * v {
2150
+ Value :: Nil => Ok ( Default :: default ( ) ) ,
2151
+ _ => v
2152
+ . as_map_iter ( )
2153
+ . ok_or_else ( || {
2154
+ invalid_type_error_inner ! ( v, "Response type not hashmap compatible" )
2155
+ } ) ?
2156
+ . map ( |( k, v) | Ok ( ( from_redis_value ( k) ?, from_redis_value ( v) ?) ) )
2157
+ . collect ( ) ,
2158
+ }
2159
+ }
2160
+ fn from_owned_redis_value ( v : Value ) -> RedisResult < hashbrown:: HashMap < K , V , S > > {
2161
+ let v = get_owned_inner_value ( v) ;
2162
+ match v {
2163
+ Value :: Nil => Ok ( Default :: default ( ) ) ,
2164
+ _ => v
2165
+ . into_map_iter ( )
2166
+ . map_err ( |v| invalid_type_error_inner ! ( v, "Response type not hashmap compatible" ) ) ?
2167
+ . map ( |( k, v) | Ok ( ( from_owned_redis_value ( k) ?, from_owned_redis_value ( v) ?) ) )
2168
+ . collect ( ) ,
2169
+ }
2170
+ }
2171
+ }
2172
+
2108
2173
#[ cfg( feature = "ahash" ) ]
2109
2174
impl < K : FromRedisValue + Eq + Hash , V : FromRedisValue > FromRedisValue for ahash:: AHashMap < K , V > {
2110
2175
fn from_redis_value ( v : & Value ) -> RedisResult < ahash:: AHashMap < K , V > > {
@@ -2175,6 +2240,29 @@ impl<T: FromRedisValue + Eq + Hash, S: BuildHasher + Default> FromRedisValue
2175
2240
}
2176
2241
}
2177
2242
2243
+ #[ cfg( feature = "hashbrown" ) ]
2244
+ impl < T : FromRedisValue + Eq + Hash , S : BuildHasher + Default > FromRedisValue
2245
+ for hashbrown:: HashSet < T , S >
2246
+ {
2247
+ fn from_redis_value ( v : & Value ) -> RedisResult < hashbrown:: HashSet < T , S > > {
2248
+ let v = get_inner_value ( v) ;
2249
+ let items = v
2250
+ . as_sequence ( )
2251
+ . ok_or_else ( || invalid_type_error_inner ! ( v, "Response type not hashset compatible" ) ) ?;
2252
+ items. iter ( ) . map ( |item| from_redis_value ( item) ) . collect ( )
2253
+ }
2254
+ fn from_owned_redis_value ( v : Value ) -> RedisResult < hashbrown:: HashSet < T , S > > {
2255
+ let v = get_owned_inner_value ( v) ;
2256
+ let items = v
2257
+ . into_sequence ( )
2258
+ . map_err ( |v| invalid_type_error_inner ! ( v, "Response type not hashset compatible" ) ) ?;
2259
+ items
2260
+ . into_iter ( )
2261
+ . map ( |item| from_owned_redis_value ( item) )
2262
+ . collect ( )
2263
+ }
2264
+ }
2265
+
2178
2266
#[ cfg( feature = "ahash" ) ]
2179
2267
impl < T : FromRedisValue + Eq + Hash > FromRedisValue for ahash:: AHashSet < T > {
2180
2268
fn from_redis_value ( v : & Value ) -> RedisResult < ahash:: AHashSet < T > > {
0 commit comments