@@ -22,19 +22,20 @@ impl Device {
2222 }
2323 }
2424
25- pub fn open ( proxy : & tio:: proxy:: Interface , route : DeviceRoute ) -> Device {
26- let port = proxy. device_full ( route) . unwrap ( ) ; // TODO
27- Self :: new ( port)
25+ pub fn open ( proxy : & tio:: proxy:: Interface , route : DeviceRoute ) -> Result < Device , proxy :: PortError > {
26+ let port = proxy. device_full ( route) ? ;
27+ Ok ( Self :: new ( port) )
2828 }
2929
30- fn internal_rpcs ( & mut self ) {
30+ fn internal_rpcs ( & mut self ) -> Result < ( ) , proxy :: SendError > {
3131 if self . n_reqs == 0 {
3232 let reqs = self . parser . requests ( ) ;
3333 for req in reqs {
34- self . dev_port . send ( req) . unwrap ( ) ;
34+ self . dev_port . send ( req) ? ;
3535 self . n_reqs += 1 ;
3636 }
3737 }
38+ Ok ( ( ) )
3839 }
3940
4041 fn process_packet ( & mut self , pkt : tio:: Packet ) -> Option < tio:: Packet > {
@@ -61,70 +62,71 @@ impl Device {
6162 None
6263 }
6364
64- pub fn get_metadata ( & mut self ) -> DeviceFullMetadata {
65+ pub fn get_metadata ( & mut self ) -> Result < DeviceFullMetadata , tio :: proxy :: RpcError > {
6566 loop {
6667 if self . n_reqs == 0 {
6768 match self . parser . get_metadata ( ) {
68- Ok ( full_meta) => return full_meta,
69+ Ok ( full_meta) => return Ok ( full_meta) ,
6970 Err ( reqs) => {
7071 for req in reqs {
71- self . dev_port . send ( req) . unwrap ( ) ;
72+ self . dev_port . send ( req) . map_err ( tio :: proxy :: RpcError :: SendFailed ) ? ;
7273 self . n_reqs += 1 ;
7374 }
7475 }
7576 }
7677 }
77- let pkt = self . dev_port . recv ( ) . unwrap ( ) ;
78+ let pkt = self . dev_port . recv ( ) . map_err ( tio :: proxy :: RpcError :: RecvFailed ) ? ;
7879 self . process_packet ( pkt) ;
7980 }
8081 }
8182
82- pub fn next ( & mut self ) -> Sample {
83+ pub fn next ( & mut self ) -> Result < Sample , tio :: proxy :: RpcError > {
8384 loop {
8485 if !self . sample_queue . is_empty ( ) {
85- return self . sample_queue . pop_front ( ) . unwrap ( ) ;
86+ return Ok ( self . sample_queue . pop_front ( ) . unwrap ( ) ) ;
8687 }
8788
88- self . internal_rpcs ( ) ;
89- let pkt = self . dev_port . recv ( ) . expect ( "no packet in blocking recv" ) ;
89+ self . internal_rpcs ( ) . map_err ( tio:: proxy:: RpcError :: SendFailed ) ?;
90+
91+ let pkt = self . dev_port . recv ( ) . map_err ( tio:: proxy:: RpcError :: RecvFailed ) ?;
9092 self . process_packet ( pkt) ;
9193 }
9294 }
9395
94- pub fn try_next ( & mut self ) -> Option < Sample > {
96+ pub fn try_next ( & mut self ) -> Result < Option < Sample > , tio :: proxy :: RpcError > {
9597 loop {
9698 if !self . sample_queue . is_empty ( ) {
97- return self . sample_queue . pop_front ( ) ;
99+ return Ok ( self . sample_queue . pop_front ( ) ) ;
98100 }
99101
100- self . internal_rpcs ( ) ;
101- self . process_packet ( match self . dev_port . try_recv ( ) {
102+ self . internal_rpcs ( ) . map_err ( tio:: proxy:: RpcError :: SendFailed ) ?;
103+
104+ let pkt = match self . dev_port . try_recv ( ) {
102105 Ok ( pkt) => pkt,
103- Err ( proxy:: RecvError :: WouldBlock ) => {
104- return None ;
105- }
106- _ => {
107- panic ! ( "receive error" ) ;
108- }
109- } ) ;
106+ Err ( proxy:: RecvError :: WouldBlock ) => return Ok ( None ) ,
107+ Err ( e) => return Err ( tio:: proxy:: RpcError :: RecvFailed ( e) ) ,
108+ } ;
109+ self . process_packet ( pkt) ;
110110 }
111111 }
112112
113- pub fn drain ( & mut self ) -> Vec < Sample > {
113+ pub fn drain ( & mut self ) -> Result < Vec < Sample > , tio :: proxy :: RpcError > {
114114 loop {
115- self . internal_rpcs ( ) ;
116- self . process_packet ( match self . dev_port . try_recv ( ) {
117- Ok ( pkt) => pkt,
115+ self . internal_rpcs ( ) . map_err ( tio:: proxy:: RpcError :: SendFailed ) ?;
116+ match self . dev_port . try_recv ( ) {
117+ Ok ( pkt) => {
118+ self . process_packet ( pkt) ;
119+ }
118120 Err ( proxy:: RecvError :: WouldBlock ) => {
119121 break ;
120122 }
121- _ => {
122- panic ! ( "receive error" ) ;
123+ Err ( e ) => {
124+ return Err ( tio :: proxy :: RpcError :: RecvFailed ( e ) ) ;
123125 }
124- } ) ;
126+ }
125127 }
126-
127- self . sample_queue . drain ( 0 ..) . collect ( )
128+
129+ Ok ( self . sample_queue . drain ( 0 ..) . collect ( ) )
128130 }
129131
130132 pub fn raw_rpc ( & mut self , name : & str , arg : & [ u8 ] ) -> Result < Vec < u8 > , tio:: proxy:: RpcError > {
@@ -137,15 +139,19 @@ impl Device {
137139 return Err ( tio:: proxy:: RpcError :: SendFailed ( err) ) ;
138140 }
139141 loop {
140- self . internal_rpcs ( ) ;
141- let pkt = self . dev_port . recv ( ) . expect ( "no packet in blocking recv" ) ;
142+ self . internal_rpcs ( ) . map_err ( tio:: proxy:: RpcError :: SendFailed ) ?;
143+ let pkt = match self . dev_port . recv ( ) {
144+ Ok ( packet) => packet,
145+ Err ( e) => return Err ( tio:: proxy:: RpcError :: RecvFailed ( e) ) ,
146+ } ;
147+
142148 if let Some ( pkt) = self . process_packet ( pkt) {
143149 match pkt. payload {
144150 tio:: proto:: Payload :: RpcReply ( rep) => return Ok ( rep. reply ) ,
145151 tio:: proto:: Payload :: RpcError ( err) => {
146152 return Err ( tio:: proxy:: RpcError :: ExecError ( err) )
147153 }
148- _ => panic ! ( "unexpected " ) ,
154+ _ => unreachable ! ( "process_packet returned a non-RPC packet to raw_rpc " ) ,
149155 }
150156 }
151157 }
@@ -176,29 +182,32 @@ impl Device {
176182 self . rpc ( name, ( ) )
177183 }
178184
179- pub fn get_multi ( & mut self , name : & str ) -> Vec < u8 > {
185+ pub fn get_multi ( & mut self , name : & str ) -> Result < Vec < u8 > , tio :: proxy :: RpcError > {
180186 let mut full_reply = vec ! [ ] ;
181187
182188 for i in 0u16 ..=65535u16 {
183189 match self . raw_rpc ( & name, & i. to_le_bytes ( ) . to_vec ( ) ) {
184190 Ok ( mut rep) => full_reply. append ( & mut rep) ,
185- Err ( proxy:: RpcError :: ExecError ( err ) ) => {
186- if let tio :: proto :: RpcErrorCode :: InvalidArgs = err. error {
187- break ;
188- } else {
189- panic ! ( "RPC error" ) ;
191+ Err ( err @ proxy:: RpcError :: ExecError ( _ ) ) => {
192+ if let proxy :: RpcError :: ExecError ( payload ) = & err {
193+ if let tio :: proto :: RpcErrorCode :: InvalidArgs = payload . error {
194+ break ;
195+ }
190196 }
197+ return Err ( err) ;
191198 }
192- _ => {
193- panic ! ( "RPC error" )
199+ Err ( e ) => {
200+ return Err ( e ) ;
194201 }
195202 }
196203 }
197204
198- full_reply
205+ Ok ( full_reply)
199206 }
200207
201- pub fn get_multi_str ( & mut self , name : & str ) -> String {
202- String :: from_utf8_lossy ( & self . get_multi ( name) ) . to_string ( )
208+ pub fn get_multi_str ( & mut self , name : & str ) -> Result < String , tio:: proxy:: RpcError > {
209+ let reply_bytes = self . get_multi ( name) ?;
210+ let result_string = String :: from_utf8_lossy ( & reply_bytes) . to_string ( ) ;
211+ Ok ( result_string)
203212 }
204213}
0 commit comments