@@ -16,7 +16,7 @@ pub fn msg_packer(input: TokenStream) -> TokenStream {
1616 let data = input. data ;
1717
1818 let mut values: Punctuated < FieldValue , Token ! [ , ] > = Punctuated :: new ( ) ;
19- let block: Block = match data {
19+ let ( block, block_size ) : ( Block , Block ) = match data {
2020 Data :: Struct ( syn:: DataStruct {
2121 struct_token : _,
2222 fields : Fields :: Named ( f) ,
@@ -25,30 +25,54 @@ pub fn msg_packer(input: TokenStream) -> TokenStream {
2525 . named
2626 . into_pairs ( )
2727 . map ( |p| p. into_value ( ) )
28- . fold ( syn:: parse_str ( "{}" ) . unwrap ( ) , | mut block, field| {
28+ . fold ( ( syn:: parse_str ( "{}" ) . unwrap ( ) , syn :: parse_str ( "{}" ) . unwrap ( ) ) , | ( mut block, mut block_size ) , field| {
2929 let ident = field. ident . as_ref ( ) . cloned ( ) . unwrap ( ) ;
3030 let ty = field. ty ;
3131
32+ block_size. stmts . push ( parse_quote ! {
33+ n += <#ty as msgpacker:: prelude:: SizeableMessage >:: packed_len( & self . #ident) ;
34+ } ) ;
35+
3236 block. stmts . push ( parse_quote ! {
3337 n += <#ty as msgpacker:: prelude:: Packable >:: pack( & self . #ident, packer. by_ref( ) ) ?;
3438 } ) ;
3539
3640 let fv = FieldValue {
3741 attrs : vec ! [ ] ,
38- member : Member :: Named ( ident. clone ( ) ) ,
42+ member : Member :: Named ( ident) ,
3943 colon_token : Some ( <Token ! [ : ] >:: default ( ) ) ,
4044 expr : parse_quote ! {
4145 <#ty as msgpacker:: prelude:: Unpackable >:: unpack( unpacker. by_ref( ) ) ?
4246 } ,
4347 } ;
4448 values. push ( fv) ;
4549
46- block
50+ ( block, block_size )
4751 } ) ,
4852 _ => todo ! ( ) ,
4953 } ;
5054
5155 let expanded = quote ! {
56+ impl msgpacker:: prelude:: SizeableMessage for #name {
57+ fn packed_len( & self ) -> usize {
58+ let mut n = 0 ;
59+
60+ #block_size
61+
62+ n
63+ }
64+ }
65+
66+ impl <' a> msgpacker:: prelude:: SizeableMessage for & ' a #name {
67+ fn packed_len( & self ) -> usize {
68+ let mut n = 0 ;
69+
70+ #block_size
71+
72+ n
73+ }
74+ }
75+
5276 impl msgpacker:: prelude:: Packable for #name {
5377 fn pack<W >( & self , mut packer: W ) -> std:: io:: Result <usize >
5478 where
@@ -62,6 +86,19 @@ pub fn msg_packer(input: TokenStream) -> TokenStream {
6286 }
6387 }
6488
89+ impl <' a> msgpacker:: prelude:: Packable for & ' a #name {
90+ fn pack<W >( & self , mut packer: W ) -> std:: io:: Result <usize >
91+ where
92+ W : std:: io:: Write
93+ {
94+ let mut n = 0 ;
95+
96+ #block
97+
98+ Ok ( n)
99+ }
100+ }
101+
65102 impl msgpacker:: prelude:: Unpackable for #name {
66103 fn unpack<R >( mut unpacker: R ) -> std:: io:: Result <Self >
67104 where
0 commit comments