Skip to content

Commit de8c882

Browse files
committed
Generify connect params errors
1 parent ca37366 commit de8c882

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

src/error.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ impl error::Error for DbError {
193193
/// Reasons a new Postgres connection could fail.
194194
#[derive(Debug)]
195195
pub enum ConnectError {
196-
/// The provided URL could not be parsed.
197-
InvalidUrl(String),
196+
/// An error creating `ConnectParams`.
197+
BadConnectParams(Box<error::Error+Sync+Send>),
198198
/// The URL was missing a user.
199199
MissingUser,
200200
/// An error from the Postgres server itself.
@@ -216,7 +216,7 @@ impl fmt::Display for ConnectError {
216216
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
217217
try!(fmt.write_str(error::Error::description(self)));
218218
match *self {
219-
ConnectError::InvalidUrl(ref msg) => write!(fmt, ": {}", msg),
219+
ConnectError::BadConnectParams(ref msg) => write!(fmt, ": {}", msg),
220220
ConnectError::DbError(ref err) => write!(fmt, ": {}", err),
221221
ConnectError::SslError(ref err) => write!(fmt, ": {}", err),
222222
ConnectError::IoError(ref err) => write!(fmt, ": {}", err),
@@ -228,8 +228,8 @@ impl fmt::Display for ConnectError {
228228
impl error::Error for ConnectError {
229229
fn description(&self) -> &str {
230230
match *self {
231-
ConnectError::InvalidUrl(_) => "Invalid URL",
232-
ConnectError::MissingUser => "User missing in URL",
231+
ConnectError::BadConnectParams(_) => "Error creating `ConnectParams`",
232+
ConnectError::MissingUser => "User missing in `ConnectParams`",
233233
ConnectError::DbError(_) => "Error reported by Postgres",
234234
ConnectError::MissingPassword => "The server requested a password but none was provided",
235235
ConnectError::UnsupportedAuthentication => {
@@ -243,6 +243,7 @@ impl error::Error for ConnectError {
243243

244244
fn cause(&self) -> Option<&error::Error> {
245245
match *self {
246+
ConnectError::BadConnectParams(ref err) => Some(&**err),
246247
ConnectError::DbError(ref err) => Some(err),
247248
ConnectError::SslError(ref err) => Some(&**err),
248249
ConnectError::IoError(ref err) => Some(err),

src/lib.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,12 @@ use std::ascii::AsciiExt;
6161
use std::borrow::ToOwned;
6262
use std::cell::{Cell, RefCell};
6363
use std::collections::{VecDeque, HashMap};
64+
use std::error::Error as StdError;
6465
use std::fmt;
6566
use std::iter::IntoIterator;
6667
use std::io as std_io;
6768
use std::io::prelude::*;
69+
use std::marker::Sync as StdSync;
6870
use std::mem;
6971
use std::result;
7072
#[cfg(feature = "unix_socket")]
@@ -145,26 +147,26 @@ pub struct ConnectParams {
145147
/// A trait implemented by types that can be converted into a `ConnectParams`.
146148
pub trait IntoConnectParams {
147149
/// Converts the value of `self` into a `ConnectParams`.
148-
fn into_connect_params(self) -> result::Result<ConnectParams, ConnectError>;
150+
fn into_connect_params(self) -> result::Result<ConnectParams, Box<StdError+StdSync+Send>>;
149151
}
150152

151153
impl IntoConnectParams for ConnectParams {
152-
fn into_connect_params(self) -> result::Result<ConnectParams, ConnectError> {
154+
fn into_connect_params(self) -> result::Result<ConnectParams, Box<StdError+StdSync+Send>> {
153155
Ok(self)
154156
}
155157
}
156158

157159
impl<'a> IntoConnectParams for &'a str {
158-
fn into_connect_params(self) -> result::Result<ConnectParams, ConnectError> {
160+
fn into_connect_params(self) -> result::Result<ConnectParams, Box<StdError+StdSync+Send>> {
159161
match Url::parse(self) {
160162
Ok(url) => url.into_connect_params(),
161-
Err(err) => return Err(ConnectError::InvalidUrl(err)),
163+
Err(err) => return Err(err.into()),
162164
}
163165
}
164166
}
165167

166168
impl IntoConnectParams for Url {
167-
fn into_connect_params(self) -> result::Result<ConnectParams, ConnectError> {
169+
fn into_connect_params(self) -> result::Result<ConnectParams, Box<StdError+StdSync+Send>> {
168170
let Url {
169171
host,
170172
port,
@@ -174,16 +176,16 @@ impl IntoConnectParams for Url {
174176
} = self;
175177

176178
#[cfg(feature = "unix_socket")]
177-
fn make_unix(maybe_path: String) -> result::Result<ConnectTarget, ConnectError> {
179+
fn make_unix(maybe_path: String)
180+
-> result::Result<ConnectTarget, Box<StdError+StdSync+Send>> {
178181
Ok(ConnectTarget::Unix(PathBuf::from(maybe_path)))
179182
}
180183
#[cfg(not(feature = "unix_socket"))]
181-
fn make_unix(_: String) -> result::Result<ConnectTarget, ConnectError> {
182-
Err(ConnectError::InvalidUrl("unix socket support requires the `unix_socket` feature"
183-
.to_string()))
184+
fn make_unix(_: String) -> result::Result<ConnectTarget, Box<StdError+StdSync+Send>> {
185+
Err("unix socket support requires the `unix_socket` feature".into())
184186
}
185187

186-
let maybe_path = try!(url::decode_component(&host).map_err(ConnectError::InvalidUrl));
188+
let maybe_path = try!(url::decode_component(&host));
187189
let target = if maybe_path.starts_with("/") {
188190
try!(make_unix(maybe_path))
189191
} else {
@@ -330,7 +332,7 @@ pub struct CancelData {
330332
pub fn cancel_query<T>(params: T, ssl: &SslMode, data: CancelData)
331333
-> result::Result<(), ConnectError>
332334
where T: IntoConnectParams {
333-
let params = try!(params.into_connect_params());
335+
let params = try!(params.into_connect_params().map_err(ConnectError::BadConnectParams));
334336
let mut socket = try!(priv_io::initialize_stream(&params, ssl));
335337

336338
try!(socket.write_message(&CancelRequest {
@@ -459,7 +461,7 @@ impl Drop for InnerConnection {
459461
impl InnerConnection {
460462
fn connect<T>(params: T, ssl: &SslMode) -> result::Result<InnerConnection, ConnectError>
461463
where T: IntoConnectParams {
462-
let params = try!(params.into_connect_params());
464+
let params = try!(params.into_connect_params().map_err(ConnectError::BadConnectParams));
463465
let stream = try!(priv_io::initialize_stream(&params, ssl));
464466

465467
let ConnectParams { user, database, mut options, .. } = params;

0 commit comments

Comments
 (0)