@@ -10,6 +10,21 @@ pub enum Error {
10
10
UsageErr ( & ' static str ) ,
11
11
ClientErr ( reqwest:: Error ) ,
12
12
ResponseErr ( String ) ,
13
+ ProtocolErr ( & ' static str ) ,
14
+ UrlErr ( url:: ParseError ) ,
15
+ WebsocketErr ( tungstenite:: error:: Error ) ,
16
+ }
17
+
18
+ impl From < url:: ParseError > for Error {
19
+ fn from ( error : url:: ParseError ) -> Self {
20
+ Error :: UrlErr ( error)
21
+ }
22
+ }
23
+
24
+ impl From < tungstenite:: error:: Error > for Error {
25
+ fn from ( error : tungstenite:: error:: Error ) -> Self {
26
+ Error :: WebsocketErr ( error)
27
+ }
13
28
}
14
29
15
30
pub fn run ( matches : & ArgMatches ) -> Result < Response , Error > {
@@ -114,23 +129,24 @@ impl NodeClient<'_> {
114
129
let mut url = Url :: parse ( & format ! (
115
130
"{}/accounts/{}/payments/incoming" ,
116
131
self . url, args[ "username" ]
117
- ) )
118
- . expect ( "Could not parse URL" ) ;
132
+ ) ) ?;
133
+
134
+ let scheme = match url. scheme ( ) {
135
+ "http" => Ok ( "ws" ) ,
136
+ "https" => Ok ( "wss" ) ,
137
+ _ => Err ( Error :: ProtocolErr ( "Unexpected URL protocol" ) ) ,
138
+ } ?;
119
139
120
- url. set_scheme ( match url. scheme ( ) {
121
- "http" => "ws" ,
122
- "https" => "wss" ,
123
- _ => panic ! ( "Unexpected URL protocol" ) ,
124
- } )
125
- . expect ( "Could not alter URL scheme" ) ;
140
+ // The scheme has already been sanitized so this should always succeed
141
+ url. set_scheme ( scheme) . expect ( "Could not alter URL scheme" ) ;
126
142
127
143
let mut request: Request = url. into ( ) ;
128
144
request. add_header (
129
145
Cow :: Borrowed ( "Authorization" ) ,
130
146
Cow :: Owned ( format ! ( "Bearer {}" , auth) ) ,
131
147
) ;
132
148
133
- let ( mut socket, _) = connect ( request) . expect ( "Could not connect to WebSocket host" ) ;
149
+ let ( mut socket, _) = connect ( request) ? ;
134
150
loop {
135
151
let msg = socket
136
152
. read_message ( )
0 commit comments