1- use crate :: dynamo:: { as_map, as_map_vec, as_string, as_string_opt} ;
1+ use crate :: dynamo:: { as_u32 , as_map, as_map_vec, as_string, as_string_opt} ;
22use aws_sdk_dynamodb:: types:: { AttributeValue , KeysAndAttributes } ;
33use http:: StatusCode ;
44use lambda_http:: tracing:: error;
55use serde:: { Deserialize , Serialize } ;
66use std:: collections:: HashMap ;
7+ use std:: hash:: Hash ;
78use twilight_model:: id:: Id ;
89use twilight_model:: id:: marker:: { GuildMarker , RoleMarker , UserMarker } ;
910use twilight_model:: util:: ImageHash ;
1011use crate :: users:: models:: Link ;
1112
12- #[ derive( Clone , Serialize , Deserialize , PartialEq ) ]
13+ #[ derive( Clone , Serialize , Deserialize , PartialEq , Eq ) ]
1314pub struct VerifyRole {
1415 pub role_id : Id < RoleMarker > ,
1516 pub role_name : Option < String > ,
1617 pub pattern : String ,
1718 pub members : u32 ,
1819}
1920
21+ impl Hash for VerifyRole {
22+ fn hash < H : std:: hash:: Hasher > ( & self , state : & mut H ) {
23+ self . role_id . hash ( state) ;
24+ self . pattern . hash ( state) ;
25+ }
26+ }
27+
2028impl From < & HashMap < String , AttributeValue > > for VerifyRole {
2129 fn from ( item : & HashMap < String , AttributeValue > ) -> Self {
2230 VerifyRole {
@@ -27,9 +35,7 @@ impl From<&HashMap<String, AttributeValue>> for VerifyRole {
2735 ) ,
2836 role_name : as_string_opt ( item. get ( "role_name" ) ) ,
2937 pattern : as_string ( item. get ( "pattern" ) , & "" . to_string ( ) ) ,
30- members : as_string ( item. get ( "members" ) , & "0" . to_string ( ) )
31- . parse :: < u32 > ( )
32- . unwrap_or ( 0 ) ,
38+ members : as_u32 ( item. get ( "members" ) , 0 ) ,
3339 }
3440 }
3541}
@@ -78,20 +84,20 @@ impl From<UserLink> for HashMap<String, AttributeValue> {
7884#[ derive( Clone , Serialize , Deserialize , PartialEq ) ]
7985pub struct Verify {
8086 pub roles : Vec < VerifyRole > ,
81- pub user_links : Vec < UserLink >
87+ pub user_links : HashMap < Id < UserMarker > , Vec < Link > > ,
8288}
8389
8490impl From < & HashMap < String , AttributeValue > > for Verify {
8591 fn from ( item : & HashMap < String , AttributeValue > ) -> Self {
86- let roles = as_map_vec ( item. get ( "roles" ) )
92+ Verify {
93+ roles : as_map_vec ( item. get ( "roles" ) )
8794 . into_iter ( )
8895 . map ( |m| m. into ( ) )
89- . collect ( ) ;
90- let user_links = as_map_vec ( item. get ( "user_links" ) )
91- . into_iter ( )
92- . map ( |m| m. into ( ) )
93- . collect ( ) ;
94- Verify { roles, user_links }
96+ . collect ( ) ,
97+ user_links : as_map ( item. get ( "user_links" ) ) . unwrap_or ( & HashMap :: new ( ) ) . iter ( ) . map (
98+ |( k, v) | ( Id :: new ( k. parse :: < u64 > ( ) . unwrap_or ( 0 ) ) , as_map_vec ( Some ( v) ) . iter ( ) . map ( |& l| l. into ( ) ) . collect ( ) ) )
99+ . collect ( )
100+ }
95101 }
96102}
97103
@@ -100,8 +106,11 @@ impl From<Verify> for HashMap<String, AttributeValue> {
100106 let mut verify_map = HashMap :: new ( ) ;
101107 let roles: Vec < AttributeValue > = verify. roles . into_iter ( ) . map ( |r| AttributeValue :: M ( r. into ( ) ) ) . collect ( ) ;
102108 verify_map. insert ( "roles" . to_string ( ) , AttributeValue :: L ( roles) ) ;
103- let user_links: Vec < AttributeValue > = verify. user_links . into_iter ( ) . map ( |ul| AttributeValue :: M ( ul. into ( ) ) ) . collect ( ) ;
104- verify_map. insert ( "user_links" . to_string ( ) , AttributeValue :: L ( user_links) ) ;
109+
110+ verify_map. insert ( "user_links" . to_string ( ) , AttributeValue :: M ( verify. user_links . iter ( ) . map (
111+ |( k, v) | ( k. to_string ( ) , AttributeValue :: L ( v. iter ( ) . map ( |l| AttributeValue :: M ( l. clone ( ) . into ( ) ) ) . collect ( ) ) )
112+ ) . collect ( ) ) ) ;
113+
105114 verify_map
106115 }
107116}
@@ -112,17 +121,15 @@ pub struct Guild {
112121 pub verify : Verify ,
113122 pub name : String ,
114123 pub icon : Option < ImageHash > ,
115- pub user_links : HashMap < Id < UserMarker > , Vec < Link > > ,
116124}
117125
118126impl Default for Guild {
119127 fn default ( ) -> Self {
120128 Guild {
121129 guild_id : Id :: new ( 1 ) ,
122- verify : Verify { roles : vec ! [ ] , user_links : vec ! [ ] } ,
130+ verify : Verify { roles : vec ! [ ] , user_links : HashMap :: new ( ) } ,
123131 name : "" . to_string ( ) ,
124132 icon : None ,
125- user_links : HashMap :: new ( ) ,
126133 }
127134 }
128135}
@@ -137,9 +144,6 @@ impl From<&HashMap<String, AttributeValue>> for Guild {
137144 verify : as_map ( item. get ( "verify" ) ) . unwrap ( ) . into ( ) ,
138145 name : as_string ( item. get ( "name" ) , & "" . to_string ( ) ) ,
139146 icon : as_string_opt ( item. get ( "icon" ) ) . and_then ( |s| ImageHash :: parse ( s. as_bytes ( ) ) . ok ( ) ) ,
140- user_links : as_map ( item. get ( "user_links" ) ) . unwrap_or ( & HashMap :: new ( ) ) . iter ( ) . map (
141- |( k, v) | ( Id :: new ( k. parse :: < u64 > ( ) . unwrap_or ( 0 ) ) , as_map_vec ( Some ( v) ) . iter ( ) . map ( |& l| l. into ( ) ) . collect ( ) ) )
142- . collect ( ) ,
143147 }
144148 }
145149}
0 commit comments