diff options
Diffstat (limited to 'src/uri.rs')
-rw-r--r-- | src/uri.rs | 44 |
1 files changed, 38 insertions, 6 deletions
@@ -1,4 +1,7 @@ -use std::collections::HashSet; +use std::{ + collections::HashSet, + convert::TryFrom, +}; use super::{ authority::Authority, @@ -56,6 +59,10 @@ use super::{ /// # } /// ``` /// +/// Implementations are provided for the [`TryFrom`] trait, so that +/// [`TryFrom::try_from`] or [`TryInto::try_into`] may be used as alternatives +/// to [`parse`]. +/// /// ## Generating a URI from its components /// /// ```rust @@ -79,6 +86,7 @@ use super::{ /// [`authority`]: #method.authority /// [`Authority` type]: struct.Authority.html /// [`host`]: #method.host +/// [`parse`]: #method.parse /// [`path`]: #method.path /// [`path_to_string`]: #method.path_to_string /// [`port`]: #method.port @@ -87,6 +95,8 @@ use super::{ /// [`set_authority`]: #method.set_authority /// [`userinfo`]: #method.userinfo /// [slice]: https://doc.rust-lang.org/std/primitive.slice.html +/// [`TryFrom::try_from`]: https://doc.rust-lang.org/std/convert/trait.TryFrom.html#tymethod.try_from +/// [`TryInto::try_into`]: https://doc.rust-lang.org/std/convert/trait.TryInto.html#tymethod.try_into #[derive(Clone, Debug, Default, PartialEq)] pub struct Uri { scheme: Option<String>, @@ -804,9 +814,27 @@ impl std::fmt::Display for Uri { } } +impl TryFrom<&'_ str> for Uri { + type Error = Error; + + fn try_from(uri_string: &'_ str) -> Result<Self, Self::Error> { + Uri::parse(uri_string) + } +} + +impl TryFrom<String> for Uri { + type Error = Error; + + fn try_from(uri_string: String) -> Result<Self, Self::Error> { + Uri::parse(uri_string) + } +} + #[cfg(test)] mod tests { + use std::convert::TryInto; + use super::*; #[test] @@ -821,7 +849,8 @@ mod tests { #[test] fn url() { - let uri = Uri::parse("http://www.example.com/foo/bar"); + let uri: Result<Uri, Error> = + "http://www.example.com/foo/bar".try_into(); assert!(uri.is_ok()); let uri = uri.unwrap(); assert_eq!(Some("http"), uri.scheme()); @@ -835,7 +864,7 @@ mod tests { #[test] fn urn_default_path_delimiter() { - let uri = Uri::parse("urn:book:fantasy:Hobbit"); + let uri = Uri::try_from("urn:book:fantasy:Hobbit"); assert!(uri.is_ok()); let uri = uri.unwrap(); assert_eq!(Some("urn"), uri.scheme()); @@ -928,6 +957,9 @@ mod tests { } #[test] + // NOTE: This lint has to be disabled at the test level because + // it's triggered inside the `named_tuple!` macro expansion. + #[allow(clippy::ref_option_ref)] fn query_and_fragment_elements() { named_tuple!( struct TestVector { @@ -1428,10 +1460,10 @@ mod tests { } #[test] - // NOTE: `clippy::too_many_arguments` lint has to be disabled at the - // test level because it's triggered inside the `named_tuple!` macro - // expansion. + // NOTE: These lints have to be disabled at the test level because they're + // triggered inside the `named_tuple!` macro expansion. #[allow(clippy::too_many_arguments)] + #[allow(clippy::ref_option_ref)] fn generate_string() { named_tuple!( struct TestVector { |