1717 * <https://www.gnu.org/licenses/>.
1818 */
1919
20- use proc_macro:: { Span , TokenStream } ;
20+ use proc_macro:: TokenStream ;
2121use quote:: quote;
2222use syn:: { parse_macro_input, parse_quote, DeriveInput , Fields , Ident , Index , Lit , Path } ;
2323
@@ -41,10 +41,9 @@ pub fn derive_packet(input: TokenStream) -> TokenStream {
4141 attr. parse_nested_meta ( |meta| {
4242 if meta. path . is_ident ( "id" ) {
4343 let lit = meta. value ( ) ?. parse ( ) ?;
44- match lit {
45- Lit :: Str ( i) => {
46- id = Some ( i) ;
47- }
44+ id = match lit {
45+ Lit :: Str ( i) => Some ( quote ! ( crawlspace_proto:: PacketId :: String ( #i) ) ) ,
46+ Lit :: Int ( i) => Some ( quote ! ( crawlspace_proto:: PacketId :: Numeric ( #i) ) ) ,
4847 _ => panic ! ( "attribute value `id` must be a string" ) ,
4948 }
5049 } else if meta. path . is_ident ( "state" ) {
@@ -88,28 +87,20 @@ pub fn derive_packet(input: TokenStream) -> TokenStream {
8887
8988 let id = id. expect ( "id must be provided for packet" ) ;
9089 let state = state. expect ( "state must be provided for packet" ) ;
91- let direction = Ident :: new (
92- direction. expect ( "direction must be provided for packet" ) ,
93- Span :: call_site ( ) . into ( ) ,
94- ) ;
9590
9691 let name = input. ident ;
9792 let where_clause = input. generics . where_clause . clone ( ) ;
9893 let generics = input. generics ;
9994
10095 quote ! {
101- impl #generics Packet for #name #generics #where_clause {
102- fn id ( ) -> & ' static str {
96+ impl #generics crawlspace_proto :: Packet for #name #generics #where_clause {
97+ fn packet_id ( ) -> crawlspace_proto :: PacketId {
10398 #id
10499 }
105100
106- fn state ( ) -> PacketState {
101+ fn packet_state ( ) -> crawlspace_proto :: ConnectionState {
107102 #state
108103 }
109-
110- fn direction( ) -> PacketDirection {
111- PacketDirection :: #direction
112- }
113104 }
114105 }
115106 . into ( )
@@ -118,12 +109,12 @@ pub fn derive_packet(input: TokenStream) -> TokenStream {
118109/// Automatically implements "straight-across" encoding for the given struct, i.e. fields are
119110/// serialized in order as is. Supports #[varint] and #[varlong] attributes on integer types to
120111/// serialize as those formats instead.
121- #[ proc_macro_derive( Encode , attributes( varint, varlong) ) ]
122- pub fn derive_encode ( input : TokenStream ) -> TokenStream {
112+ #[ proc_macro_derive( Write , attributes( varint, varlong) ) ]
113+ pub fn derive_write ( input : TokenStream ) -> TokenStream {
123114 let input = parse_macro_input ! ( input as DeriveInput ) ;
124115
125116 let syn:: Data :: Struct ( data) = input. data else {
126- panic ! ( "Can only derive Encode on a struct" ) ;
117+ panic ! ( "Can only derive Write on a struct" ) ;
127118 } ;
128119
129120 let name = input. ident ;
@@ -143,19 +134,19 @@ pub fn derive_encode(input: TokenStream) -> TokenStream {
143134 . any ( |attr| attr. meta . path ( ) . is_ident ( "varint" ) )
144135 {
145136 fields_encoded. extend ( quote ! {
146- VarInt ( self . #field_name as i32 ) . encode ( & mut w) ?;
137+ VarInt ( self . #field_name as i32 ) . write ( w) ?;
147138 } ) ;
148139 } else if field
149140 . attrs
150141 . iter ( )
151142 . any ( |attr| attr. meta . path ( ) . is_ident ( "varlong" ) )
152143 {
153144 fields_encoded. extend ( quote ! {
154- VarLong ( self . #field_name as i64 ) . encode ( & mut w) ?;
145+ VarLong ( self . #field_name as i64 ) . write ( w) ?;
155146 } ) ;
156147 } else {
157148 fields_encoded. extend ( quote ! {
158- self . #field_name. encode ( & mut w) ?;
149+ self . #field_name. write ( w) ?;
159150 } ) ;
160151 }
161152 }
@@ -170,19 +161,19 @@ pub fn derive_encode(input: TokenStream) -> TokenStream {
170161 . any ( |attr| attr. meta . path ( ) . is_ident ( "varint" ) )
171162 {
172163 fields_encoded. extend ( quote ! {
173- VarInt ( self . #i as i32 ) . encode ( & mut w) ?;
164+ VarInt ( self . #i as i32 ) . write ( w) ?;
174165 } ) ;
175166 } else if field
176167 . attrs
177168 . iter ( )
178169 . any ( |attr| attr. meta . path ( ) . is_ident ( "varlong" ) )
179170 {
180171 fields_encoded. extend ( quote ! {
181- VarLong ( self . #i as i64 ) . encode ( & mut w) ?;
172+ VarLong ( self . #i as i64 ) . write ( w) ?;
182173 } ) ;
183174 } else {
184175 fields_encoded. extend ( quote ! {
185- self . #i. encode ( & mut w) ?;
176+ self . #i. write ( w) ?;
186177 } ) ;
187178 }
188179 }
@@ -191,8 +182,8 @@ pub fn derive_encode(input: TokenStream) -> TokenStream {
191182 }
192183
193184 quote ! {
194- impl #generics Encode for #name #generics #where_clause {
195- fn encode( & self , mut w: impl std:: io:: Write ) -> color_eyre :: Result <( ) > {
185+ impl #generics Write for #name #generics #where_clause {
186+ fn encode( & self , w: & mut impl std:: io:: Write ) -> crawlspace_proto :: Result <( ) > {
196187 #fields_encoded
197188
198189 Ok ( ( ) )
@@ -205,12 +196,12 @@ pub fn derive_encode(input: TokenStream) -> TokenStream {
205196/// Automatically implements "straight-across" decoding for the given struct, i.e. fields are
206197/// deserialized in order as is. Supports #[decode_as(type)] to deserialize according to a different type.
207198/// uses TryInto to convert to the expected type where necessary.
208- #[ proc_macro_derive( Decode , attributes( decode_as) ) ]
209- pub fn derive_decode ( input : TokenStream ) -> TokenStream {
199+ #[ proc_macro_derive( Read , attributes( decode_as) ) ]
200+ pub fn derive_read ( input : TokenStream ) -> TokenStream {
210201 let input = parse_macro_input ! ( input as DeriveInput ) ;
211202
212203 let syn:: Data :: Struct ( data) = input. data else {
213- panic ! ( "Can only derive Decode on a struct" ) ;
204+ panic ! ( "Can only derive Read on a struct" ) ;
214205 } ;
215206
216207 let name = input. ident ;
@@ -223,8 +214,6 @@ pub fn derive_decode(input: TokenStream) -> TokenStream {
223214 let field_name = field. ident . expect ( "couldn't get ident for named field" ) ;
224215 let ty = field. ty ;
225216
226- let wrapped = format ! ( "for field {field_name} in {name}" ) ;
227-
228217 if let Some ( attr) = field
229218 . attrs
230219 . iter ( )
@@ -235,14 +224,11 @@ pub fn derive_decode(input: TokenStream) -> TokenStream {
235224 . expect ( "decode_as value must be a Path" ) ;
236225
237226 field_tokens. extend ( quote ! {
238- #field_name: <#ty as Decode >:: decode( r)
239- . wrap_err( #wrapped) ?
240- . try_into( ) ?,
227+ #field_name: <#ty as Read >:: read( r) ?. try_into( ) ?,
241228 } ) ;
242229 } else {
243230 field_tokens. extend ( quote ! {
244- #field_name: <#ty as Decode >:: decode( r)
245- . wrap_err( #wrapped) ?,
231+ #field_name: <#ty as Read >:: read( r) ?,
246232 } ) ;
247233 }
248234 }
@@ -254,11 +240,9 @@ pub fn derive_decode(input: TokenStream) -> TokenStream {
254240 }
255241 Fields :: Unnamed ( fields) => {
256242 let mut field_tokens = proc_macro2:: TokenStream :: new ( ) ;
257- for ( i , field) in fields. unnamed . into_iter ( ) . enumerate ( ) {
243+ for field in fields. unnamed . into_iter ( ) {
258244 let ty = field. ty ;
259245
260- let wrapped = format ! ( "for field {i} in {name}" ) ;
261-
262246 if let Some ( attr) = field
263247 . attrs
264248 . iter ( )
@@ -269,13 +253,12 @@ pub fn derive_decode(input: TokenStream) -> TokenStream {
269253 . expect ( "decode_as value must be a Path" ) ;
270254
271255 field_tokens. extend ( quote ! {
272- <#ty as Decode >:: decode( r)
273- . wrap_err( #wrapped) ?
256+ <#ty as Read >:: read( r) ?
274257 . try_into( ) ?,
275258 } ) ;
276259 } else {
277260 field_tokens. extend ( quote ! {
278- <#ty as Decode >:: decode ( r ) . wrap_err ( #wrapped ) ?,
261+ <#ty as Read >:: read ( r ) ?,
279262 } ) ;
280263 }
281264 }
@@ -289,18 +272,12 @@ pub fn derive_decode(input: TokenStream) -> TokenStream {
289272 let struct_generics = input. generics ;
290273 let where_clause = struct_generics. where_clause . clone ( ) ;
291274
292- let mut impl_generics = struct_generics. clone ( ) ;
293- if impl_generics. lifetimes ( ) . count ( ) == 0 {
294- impl_generics. params . push ( parse_quote ! ( ' a) ) ;
295- }
296-
297275 quote ! {
298- impl #impl_generics Decode #impl_generics for #name #struct_generics #where_clause {
299- fn decode ( r: & mut & ' a [ u8 ] ) -> color_eyre :: Result <Self >
276+ impl #struct_generics crawlspace_proto :: Read for #name #struct_generics #where_clause {
277+ fn read ( r: & mut impl std :: io :: Read ) -> crawlspace_proto :: Result <Self >
300278 where
301279 Self : Sized ,
302280 {
303- use color_eyre:: eyre:: WrapErr ;
304281 Ok ( #struct_tokens)
305282 }
306283 }
0 commit comments