55
66use serde:: de:: Error as DeError ;
77use serde:: Serialize ;
8+ use serde_json:: value:: RawValue ;
89use strum:: { EnumCount , IntoStaticStr , VariantNames } ;
910
1011use crate :: constants:: Opcode ;
1112use crate :: internal:: utils:: lending_for_each;
1213use crate :: model:: prelude:: * ;
13- use crate :: model:: utils:: remove_from_map;
1414
1515/// Requires no gateway intents.
1616///
@@ -933,9 +933,7 @@ pub enum GatewayEvent {
933933 Dispatch {
934934 seq : u64 ,
935935 // Avoid deserialising straight away to handle errors and get access to `seq`.
936- data : JsonMap ,
937- // Used for debugging, if the data cannot be deserialised.
938- original_str : FixedString ,
936+ event : Vec < u8 > ,
939937 } ,
940938 Heartbeat ( #[ deprecated = "always 0 because it is never provided by the gateway" ] u64 ) ,
941939 Reconnect ,
@@ -948,30 +946,53 @@ pub enum GatewayEvent {
948946// Manual impl needed to emulate integer enum tags
949947impl < ' de > Deserialize < ' de > for GatewayEvent {
950948 fn deserialize < D : Deserializer < ' de > > ( deserializer : D ) -> StdResult < Self , D :: Error > {
951- let mut map = JsonMap :: deserialize ( deserializer) ?;
952-
953- Ok ( match remove_from_map ( & mut map, "op" ) ? {
954- Opcode :: Dispatch => {
955- Self :: Dispatch {
956- seq : remove_from_map ( & mut map, "s" ) ?,
957- // Filled in in recv_event
958- original_str : FixedString :: new ( ) ,
959- data : map,
960- }
949+ #[ derive( Debug , Clone , Deserialize ) ]
950+ struct GatewayEventRaw < ' a > {
951+ op : Opcode ,
952+ #[ serde( rename = "s" ) ]
953+ seq : Option < u64 > ,
954+ #[ serde( rename = "d" ) ]
955+ data : & ' a RawValue ,
956+ #[ serde( rename = "t" ) ]
957+ ty : Option < & ' a str > ,
958+ }
959+
960+ #[ derive( Debug , Clone , Serialize ) ]
961+ struct UndeserializedEvent < ' a > {
962+ #[ serde( rename = "d" ) ]
963+ data : & ' a RawValue ,
964+ #[ serde( rename = "t" ) ]
965+ ty : & ' a str ,
966+ }
967+
968+ let raw: GatewayEventRaw < ' _ > = Deserialize :: deserialize ( deserializer) ?;
969+
970+ Ok ( match raw. op {
971+ Opcode :: Dispatch => Self :: Dispatch {
972+ seq : raw. seq . ok_or_else ( || DeError :: custom ( "missing seq" ) ) ?,
973+ event : serde_json:: to_vec ( & UndeserializedEvent {
974+ data : raw. data ,
975+ ty : raw. ty . ok_or_else ( || DeError :: custom ( "missing t" ) ) ?,
976+ } )
977+ . map_err ( DeError :: custom) ?,
961978 } ,
962979 Opcode :: Heartbeat => {
963980 // Placeholder value. Discord expects the last Dispatch
964981 // sequence number and doesn't send it with the heartbeat.
965982 Self :: Heartbeat ( 0 )
966983 } ,
967- Opcode :: InvalidSession => Self :: InvalidateSession ( remove_from_map ( & mut map, "d" ) ?) ,
984+ Opcode :: InvalidSession => Self :: InvalidateSession (
985+ serde_json:: from_str ( raw. data . get ( ) ) . map_err ( DeError :: custom) ?,
986+ ) ,
968987 Opcode :: Hello => {
969988 #[ derive( Deserialize ) ]
970989 struct HelloPayload {
971990 heartbeat_interval : u64 ,
972991 }
973992
974- let inner: HelloPayload = remove_from_map ( & mut map, "d" ) ?;
993+ let inner: HelloPayload =
994+ serde_json:: from_str ( raw. data . get ( ) ) . map_err ( DeError :: custom) ?;
995+
975996 Self :: Hello ( inner. heartbeat_interval )
976997 } ,
977998 Opcode :: Reconnect => Self :: Reconnect ,
0 commit comments