1
1
///! Packet definitions.
2
2
use bytes:: { BufMut , Bytes , BytesMut } ;
3
- use num_derive:: FromPrimitive ;
4
3
use std:: convert:: From ;
5
4
use std:: io;
6
5
use std:: str;
@@ -10,7 +9,7 @@ use crate::parse::*;
10
9
11
10
pub ( crate ) const PACKET_DATA_HEADER_LEN : usize = 4 ;
12
11
13
- #[ derive( Debug , Clone , Copy , PartialEq , FromPrimitive ) ]
12
+ #[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
14
13
#[ repr( u16 ) ]
15
14
pub ( crate ) enum PacketType {
16
15
Rrq = 1 ,
@@ -66,6 +65,26 @@ pub(crate) struct Opts {
66
65
pub transfer_size : Option < u64 > ,
67
66
}
68
67
68
+ impl PacketType {
69
+ pub ( crate ) fn from_u16 ( n : u16 ) -> Option < PacketType > {
70
+ match n {
71
+ 1 => Some ( PacketType :: Rrq ) ,
72
+ 2 => Some ( PacketType :: Wrq ) ,
73
+ 3 => Some ( PacketType :: Data ) ,
74
+ 4 => Some ( PacketType :: Ack ) ,
75
+ 5 => Some ( PacketType :: Error ) ,
76
+ 6 => Some ( PacketType :: OAck ) ,
77
+ _ => None ,
78
+ }
79
+ }
80
+ }
81
+
82
+ impl From < PacketType > for u16 {
83
+ fn from ( value : PacketType ) -> Self {
84
+ value as u16
85
+ }
86
+ }
87
+
69
88
impl < ' a > Packet < ' a > {
70
89
pub ( crate ) fn decode ( data : & [ u8 ] ) -> Result < Packet > {
71
90
parse_packet ( data)
@@ -74,45 +93,45 @@ impl<'a> Packet<'a> {
74
93
pub ( crate ) fn encode ( & self , buf : & mut BytesMut ) {
75
94
match self {
76
95
Packet :: Rrq ( req) => {
77
- buf. put_u16 ( PacketType :: Rrq as u16 ) ;
96
+ buf. put_u16 ( PacketType :: Rrq . into ( ) ) ;
78
97
buf. put_slice ( req. filename . as_bytes ( ) ) ;
79
98
buf. put_u8 ( 0 ) ;
80
99
buf. put_slice ( req. mode . to_str ( ) . as_bytes ( ) ) ;
81
100
buf. put_u8 ( 0 ) ;
82
101
req. opts . encode ( buf) ;
83
102
}
84
103
Packet :: Wrq ( req) => {
85
- buf. put_u16 ( PacketType :: Wrq as u16 ) ;
104
+ buf. put_u16 ( PacketType :: Wrq . into ( ) ) ;
86
105
buf. put_slice ( req. filename . as_bytes ( ) ) ;
87
106
buf. put_u8 ( 0 ) ;
88
107
buf. put_slice ( req. mode . to_str ( ) . as_bytes ( ) ) ;
89
108
buf. put_u8 ( 0 ) ;
90
109
req. opts . encode ( buf) ;
91
110
}
92
111
Packet :: Data ( block, data) => {
93
- buf. put_u16 ( PacketType :: Data as u16 ) ;
112
+ buf. put_u16 ( PacketType :: Data . into ( ) ) ;
94
113
buf. put_u16 ( * block) ;
95
114
buf. put_slice ( data) ;
96
115
}
97
116
Packet :: Ack ( block) => {
98
- buf. put_u16 ( PacketType :: Ack as u16 ) ;
117
+ buf. put_u16 ( PacketType :: Ack . into ( ) ) ;
99
118
buf. put_u16 ( * block) ;
100
119
}
101
120
Packet :: Error ( error) => {
102
- buf. put_u16 ( PacketType :: Error as u16 ) ;
121
+ buf. put_u16 ( PacketType :: Error . into ( ) ) ;
103
122
buf. put_u16 ( error. code ( ) ) ;
104
123
buf. put_slice ( error. msg ( ) . as_bytes ( ) ) ;
105
124
buf. put_u8 ( 0 ) ;
106
125
}
107
126
Packet :: OAck ( opts) => {
108
- buf. put_u16 ( PacketType :: OAck as u16 ) ;
127
+ buf. put_u16 ( PacketType :: OAck . into ( ) ) ;
109
128
opts. encode ( buf) ;
110
129
}
111
130
}
112
131
}
113
132
114
133
pub ( crate ) fn encode_data_head ( block_id : u16 , buf : & mut BytesMut ) {
115
- buf. put_u16 ( PacketType :: Data as u16 ) ;
134
+ buf. put_u16 ( PacketType :: Data . into ( ) ) ;
116
135
buf. put_u16 ( block_id) ;
117
136
}
118
137
0 commit comments