@@ -162,25 +162,8 @@ impl TryInto<(BlockHash, Option<u32>)> for JsonResponse {
162162impl  TryInto < Txid >  for  JsonResponse  { 
163163	type  Error  = std:: io:: Error ; 
164164	fn  try_into ( self )  -> std:: io:: Result < Txid >  { 
165- 		match  self . 0 . as_str ( )  { 
166- 			None  => Err ( std:: io:: Error :: new ( 
167- 				std:: io:: ErrorKind :: InvalidData , 
168- 				"expected JSON string" , 
169- 			) ) , 
170- 			Some ( hex_data)  => match  Vec :: < u8 > :: from_hex ( hex_data)  { 
171- 				Err ( _)  => Err ( std:: io:: Error :: new ( 
172- 					std:: io:: ErrorKind :: InvalidData , 
173- 					"invalid hex data" , 
174- 				) ) , 
175- 				Ok ( txid_data)  => match  encode:: deserialize ( & txid_data)  { 
176- 					Err ( _)  => Err ( std:: io:: Error :: new ( 
177- 						std:: io:: ErrorKind :: InvalidData , 
178- 						"invalid txid" , 
179- 					) ) , 
180- 					Ok ( txid)  => Ok ( txid) , 
181- 				} , 
182- 			} , 
183- 		} 
165+ 		let  hex_data = self . 0 . as_str ( ) . ok_or ( Self :: Error :: new ( std:: io:: ErrorKind :: InvalidData ,  "expected JSON string"  ) ) ?; 
166+ 		Txid :: from_str ( hex_data) . map_err ( |err|Self :: Error :: new ( std:: io:: ErrorKind :: InvalidData ,  err. to_string ( )  ) ) 
184167	} 
185168} 
186169
@@ -622,7 +605,7 @@ pub(crate) mod tests {
622605		match  TryInto :: < Txid > :: try_into ( response)  { 
623606			Err ( e)  => { 
624607				assert_eq ! ( e. kind( ) ,  std:: io:: ErrorKind :: InvalidData ) ; 
625- 				assert_eq ! ( e. get_ref( ) . unwrap( ) . to_string( ) ,  "invalid  hex data " ) ; 
608+ 				assert_eq ! ( e. get_ref( ) . unwrap( ) . to_string( ) ,  "bad  hex string length 6 (expected 64) " ) ; 
626609			} 
627610			Ok ( _)  => panic ! ( "Expected error" ) , 
628611		} 
@@ -634,7 +617,7 @@ pub(crate) mod tests {
634617		match  TryInto :: < Txid > :: try_into ( response)  { 
635618			Err ( e)  => { 
636619				assert_eq ! ( e. kind( ) ,  std:: io:: ErrorKind :: InvalidData ) ; 
637- 				assert_eq ! ( e. get_ref( ) . unwrap( ) . to_string( ) ,  "invalid txid " ) ; 
620+ 				assert_eq ! ( e. get_ref( ) . unwrap( ) . to_string( ) ,  "bad hex string length 4 (expected 64) " ) ; 
638621			} 
639622			Ok ( _)  => panic ! ( "Expected error" ) , 
640623		} 
@@ -650,6 +633,20 @@ pub(crate) mod tests {
650633		} 
651634	} 
652635
636+ 	#[ test]  
637+ 	fn  into_txid_from_bitcoind_rpc_json_response ( )  { 
638+ 		let  mut  rpc_response = serde_json:: json!( 
639+             { "error" :  "" ,  "id" :  "770" ,  "result" :  "7934f775149929a8b742487129a7c3a535dfb612f0b726cc67bc10bc2628f906" } 
640+ 
641+         ) ; 
642+         let  r:  std:: io:: Result < Txid >  = JsonResponse ( rpc_response. get_mut ( "result" ) . unwrap ( ) . take ( ) ) 
643+             . try_into ( ) ; 
644+         assert_eq ! ( 
645+             r. unwrap( ) . to_string( ) , 
646+             "7934f775149929a8b742487129a7c3a535dfb612f0b726cc67bc10bc2628f906" 
647+         ) ; 
648+ 	} 
649+ 
653650	// TryInto<Transaction> can be used in two ways, first with plain hex response where data is 
654651	// the hex encoded transaction (e.g. as a result of getrawtransaction) or as a JSON object 
655652	// where the hex encoded transaction can be found in the hex field of the object (if present) 
0 commit comments