@@ -1563,8 +1563,16 @@ impl_to_redis_args_for_set!(
1563
1563
where ( T : ToRedisArgs + Hash + Eq , S : BuildHasher + Default )
1564
1564
) ;
1565
1565
1566
+ /// @note: Redis cannot store empty sets so the application has to
1567
+ /// check whether the set is empty and if so, not attempt to use that
1568
+ /// result
1566
1569
macro_rules! impl_to_redis_args_for_map {
1567
- ( for <$( $TypeParam: ident) ,+> $MapType: ty, where ( $( $WhereClause: tt) +) ) => {
1570
+ (
1571
+ $( #[ $meta: meta] ) *
1572
+ for <$( $TypeParam: ident) ,+> $MapType: ty,
1573
+ where ( $( $WhereClause: tt) +)
1574
+ ) => {
1575
+ $( #[ $meta] ) *
1568
1576
impl < $( $TypeParam) ,+ > ToRedisArgs for $MapType
1569
1577
where
1570
1578
$( $WhereClause) +
@@ -1574,29 +1582,26 @@ macro_rules! impl_to_redis_args_for_map {
1574
1582
W : ?Sized + RedisWrite ,
1575
1583
{
1576
1584
for ( key, value) in self {
1585
+ // Ensure key and value produce a single argument each
1577
1586
assert!( key. num_of_args( ) <= 1 && value. num_of_args( ) <= 1 ) ;
1578
1587
key. write_redis_args( out) ;
1579
1588
value. write_redis_args( out) ;
1580
1589
}
1581
1590
}
1582
1591
1583
1592
fn num_of_args( & self ) -> usize {
1584
- self . len( ) * 2
1593
+ self . len( )
1585
1594
}
1586
1595
}
1587
1596
} ;
1588
1597
}
1589
-
1590
1598
impl_to_redis_args_for_map ! (
1591
1599
for <K , V > std:: collections:: HashMap <K , V >,
1592
1600
where ( K : ToRedisArgs + Hash + Eq + Ord , V : ToRedisArgs )
1593
1601
) ;
1594
1602
1595
- /// this flattens BTreeMap into something that goes well with HMSET
1596
- /// @note: Redis cannot store empty sets so the application has to
1597
- /// check whether the set is empty and if so, not attempt to use that
1598
- /// result
1599
1603
impl_to_redis_args_for_map ! (
1604
+ /// this flattens BTreeMap into something that goes well with HMSET
1600
1605
for <K , V > std:: collections:: BTreeMap <K , V >,
1601
1606
where ( K : ToRedisArgs + Hash + Eq + Ord , V : ToRedisArgs )
1602
1607
) ;
@@ -2079,18 +2084,30 @@ macro_rules! impl_from_redis_value_for_map {
2079
2084
{
2080
2085
fn from_redis_value( v: & Value ) -> RedisResult <$MapType> {
2081
2086
let v = get_inner_value( v) ;
2082
- v. as_map_iter( )
2083
- . ok_or_else( || invalid_type_error_inner!( v, $err_msg) ) ?
2084
- . map( |( k, v) | Ok ( ( from_redis_value( k) ?, from_redis_value( v) ?) ) )
2085
- . collect( )
2087
+ match * v {
2088
+ Value :: Nil => Ok ( Default :: default ( ) ) ,
2089
+ _ => v
2090
+ . as_map_iter( )
2091
+ . ok_or_else( || invalid_type_error_inner!( v, $err_msg) ) ?
2092
+ . map( |( k, v) | {
2093
+ Ok ( ( from_redis_value( k) ?, from_redis_value( v) ?) )
2094
+ } )
2095
+ . collect( ) ,
2096
+ }
2086
2097
}
2087
2098
2088
2099
fn from_owned_redis_value( v: Value ) -> RedisResult <$MapType> {
2089
2100
let v = get_owned_inner_value( v) ;
2090
- v. into_map_iter( )
2091
- . map_err( |v| invalid_type_error_inner!( v, $err_msg) ) ?
2092
- . map( |( k, v) | Ok ( ( from_owned_redis_value( k) ?, from_owned_redis_value( v) ?) ) )
2093
- . collect( )
2101
+ match v {
2102
+ Value :: Nil => Ok ( Default :: default ( ) ) ,
2103
+ _ => v
2104
+ . into_map_iter( )
2105
+ . map_err( |v| invalid_type_error_inner!( v, $err_msg) ) ?
2106
+ . map( |( k, v) | {
2107
+ Ok ( ( from_owned_redis_value( k) ?, from_owned_redis_value( v) ?) )
2108
+ } )
2109
+ . collect( ) ,
2110
+ }
2094
2111
}
2095
2112
}
2096
2113
} ;
0 commit comments