From 4dd18a8a07a3deb6c23b3d1d37fbab0f9bf77487 Mon Sep 17 00:00:00 2001 From: M3rs Date: Wed, 8 May 2019 18:57:19 -0500 Subject: [PATCH 1/3] feat(client): Implement TryFrom for Destination Add TryFrom impl for Destination, for compiler version >= 1.34. Add basic unit tests for TryFrom impl Ref Issue: Implement TryFrom for Destination #1808 --- build.rs | 6 +++++- src/client/connect/mod.rs | 30 +++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/build.rs b/build.rs index c34535fe4d..aae8968807 100644 --- a/build.rs +++ b/build.rs @@ -3,7 +3,11 @@ extern crate rustc_version; use rustc_version::{version, Version}; fn main() { - if version().unwrap() >= Version::parse("1.30.0").unwrap() { + let version = version().unwrap(); + if version >= Version::parse("1.30.0").unwrap() { println!("cargo:rustc-cfg=error_source"); } + if version >= Version::parse("1.34.0").unwrap() { + println!("cargo:rustc-cfg=try_from"); + } } diff --git a/src/client/connect/mod.rs b/src/client/connect/mod.rs index 764835cfb2..06d5a3c132 100644 --- a/src/client/connect/mod.rs +++ b/src/client/connect/mod.rs @@ -7,6 +7,7 @@ //! - The [`Connect`](Connect) trait and related types to build custom connectors. use std::error::Error as StdError; use std::{fmt, mem}; +use std::convert::TryFrom; use bytes::{BufMut, Bytes, BytesMut}; use futures::Future; @@ -251,6 +252,17 @@ impl Destination { */ } +#[cfg(try_from)] +impl TryFrom for Destination { + type Error = ::error::Error; + + fn try_from(uri: Uri) -> Result { + uri.authority_part().ok_or(::error::Parse::Uri)?; + uri.scheme_part().ok_or(::error::Parse::Uri)?; + Ok(Destination { uri }) + } +} + impl Connected { /// Create new `Connected` type with empty metadata. pub fn new() -> Connected { @@ -381,7 +393,7 @@ where #[cfg(test)] mod tests { - use super::{Connected, Destination}; + use super::{Connected, Destination, TryFrom}; #[test] fn test_destination_set_scheme() { @@ -527,6 +539,22 @@ mod tests { assert_eq!(dst.port(), None); } + #[cfg(try_from)] + #[test] + fn test_try_from_destination() { + let uri: http::Uri = "http://hyper.rs".parse().expect("initial parse"); + let result = Destination::try_from(uri); + assert_eq!(result.is_ok(), true); + } + + #[cfg(try_from)] + #[test] + fn test_try_from_no_scheme() { + let uri: http::Uri = "hyper.rs".parse().expect("initial parse error"); + let result = Destination::try_from(uri); + assert_eq!(result.is_err(), true); + } + #[derive(Clone, Debug, PartialEq)] struct Ex1(usize); From ea02c04f67e8ec793bdc11bc5046233195dcc818 Mon Sep 17 00:00:00 2001 From: M3rs Date: Wed, 8 May 2019 19:45:19 -0500 Subject: [PATCH 2/3] fix(client): Add #[cfg(try_from)] to TryFrom import Add #[cfg(try_from)] to TryFrom import. Ref Issue; #1808 --- src/client/connect/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/connect/mod.rs b/src/client/connect/mod.rs index 06d5a3c132..54f2672302 100644 --- a/src/client/connect/mod.rs +++ b/src/client/connect/mod.rs @@ -7,7 +7,7 @@ //! - The [`Connect`](Connect) trait and related types to build custom connectors. use std::error::Error as StdError; use std::{fmt, mem}; -use std::convert::TryFrom; +#[cfg(try_from)] use std::convert::TryFrom; use bytes::{BufMut, Bytes, BytesMut}; use futures::Future; From f5cb0bca93ea460bd116f0987465ed386d7a23a0 Mon Sep 17 00:00:00 2001 From: M3rs Date: Wed, 8 May 2019 20:26:50 -0500 Subject: [PATCH 3/3] fix(client): Change TryFrom to use try_from_uri Change TryFrom for Destination to use Destination's internal try_from_uri method. Ref Issue: #1808 --- src/client/connect/mod.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/client/connect/mod.rs b/src/client/connect/mod.rs index 54f2672302..ea04ffa09f 100644 --- a/src/client/connect/mod.rs +++ b/src/client/connect/mod.rs @@ -257,9 +257,7 @@ impl TryFrom for Destination { type Error = ::error::Error; fn try_from(uri: Uri) -> Result { - uri.authority_part().ok_or(::error::Parse::Uri)?; - uri.scheme_part().ok_or(::error::Parse::Uri)?; - Ok(Destination { uri }) + Destination::try_from_uri(uri) } }