Use ? instead of unwrap in examples (#458)

This is recommended by the Rust API Guidelines:

https://rust-lang.github.io/api-guidelines/documentation.html#examples-use--not-try-not-unwrap-c-question-mark

One exception: When we need to unwrap an Option, the examples still use
.unwrap(). The alternative would be something like
`.ok_or(SomeErrorHere)?`, which feels like an awkward way to deal with
an Option. This might get better with NoneError:

https://docs.rs/rustc-std-workspace-std/1.0.1/std/option/struct.NoneError.html

I also rearranged some examples that used turbofish to use type
annotations. I think type annotations are more familiar to early Rust
users (and they use fewer characters and less punctuation, which is
always nice).
This commit is contained in:
Jacob Hoffman-Andrews
2021-12-19 20:04:30 -08:00
committed by GitHub
parent 2563df4f62
commit 2df70168c4
5 changed files with 21 additions and 14 deletions

View File

@@ -157,7 +157,7 @@ impl Agent {
/// use {url::Url, ureq::Response}; /// use {url::Url, ureq::Response};
/// let agent = ureq::agent(); /// let agent = ureq::agent();
/// ///
/// let mut url: Url = "http://example.com/some-page".parse().unwrap(); /// let mut url: Url = "http://example.com/some-page".parse()?;
/// url.set_path("/robots.txt"); /// url.set_path("/robots.txt");
/// let resp: Response = agent /// let resp: Response = agent
/// .request_url("GET", &url) /// .request_url("GET", &url)
@@ -216,7 +216,7 @@ impl Agent {
/// ///
/// // Saves (persistent) cookies /// // Saves (persistent) cookies
/// let mut file = File::create("cookies.json")?; /// let mut file = File::create("cookies.json")?;
/// agent.cookie_store().save_json(&mut file).unwrap(); /// agent.cookie_store().save_json(&mut file)?;
/// # Ok(()) /// # Ok(())
/// # } /// # }
/// ``` /// ```
@@ -550,7 +550,7 @@ impl AgentBuilder {
/// # ureq::is_test(true); /// # ureq::is_test(true);
/// use std::sync::Arc; /// use std::sync::Arc;
/// # #[cfg(feature = "native-tls")] /// # #[cfg(feature = "native-tls")]
/// let tls_connector = Arc::new(native_tls::TlsConnector::new().unwrap()); /// let tls_connector = Arc::new(native_tls::TlsConnector::new()?);
/// # #[cfg(feature = "native-tls")] /// # #[cfg(feature = "native-tls")]
/// let agent = ureq::builder() /// let agent = ureq::builder()
/// .tls_connector(tls_connector.clone()) /// .tls_connector(tls_connector.clone())
@@ -580,7 +580,7 @@ impl AgentBuilder {
/// let read = BufReader::new(file); /// let read = BufReader::new(file);
/// ///
/// // Read persisted cookies from cookies.json /// // Read persisted cookies from cookies.json
/// let my_store = CookieStore::load_json(read).unwrap(); /// let my_store = CookieStore::load_json(read)?;
/// ///
/// // Cookies will be used for requests done through agent. /// // Cookies will be used for requests done through agent.
/// let agent = ureq::builder() /// let agent = ureq::builder()

View File

@@ -116,6 +116,7 @@ impl Error {
/// * [`Transport::source()`](std::error::Error::source) holds the underlying error with even more details. /// * [`Transport::source()`](std::error::Error::source) holds the underlying error with even more details.
/// ///
/// ``` /// ```
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
/// use ureq::ErrorKind; /// use ureq::ErrorKind;
/// use std::error::Error; /// use std::error::Error;
/// use url::ParseError; /// use url::ParseError;
@@ -137,9 +138,11 @@ impl Error {
/// // boxed underlying error /// // boxed underlying error
/// let source = error.source().unwrap(); /// let source = error.source().unwrap();
/// // downcast to original error /// // downcast to original error
/// let downcast = source.downcast_ref::<ParseError>().unwrap(); /// let downcast: &ParseError = source.downcast_ref().unwrap();
/// ///
/// assert_eq!(downcast.to_string(), "relative URL without a base"); /// assert_eq!(downcast.to_string(), "relative URL without a base");
/// # Ok(())
/// # }
/// ``` /// ```
#[derive(Debug)] #[derive(Debug)]
pub struct Transport { pub struct Transport {

View File

@@ -263,7 +263,7 @@
//! use ureq::Agent; //! use ureq::Agent;
//! //!
//! let agent = ureq::AgentBuilder::new() //! let agent = ureq::AgentBuilder::new()
//! .tls_connector(Arc::new(native_tls::TlsConnector::new().unwrap())) //! .tls_connector(Arc::new(native_tls::TlsConnector::new()?))
//! .build(); //! .build();
//! # Ok(()) //! # Ok(())
//! # } //! # }
@@ -487,7 +487,7 @@ pub fn request(method: &str, path: &str) -> Request {
/// use url::Url; /// use url::Url;
/// let agent = ureq::agent(); /// let agent = ureq::agent();
/// ///
/// let mut url: Url = "http://example.com/some-page".parse().unwrap(); /// let mut url: Url = "http://example.com/some-page".parse()?;
/// url.set_path("/robots.txt"); /// url.set_path("/robots.txt");
/// let resp: ureq::Response = ureq::request_url("GET", &url) /// let resp: ureq::Response = ureq::request_url("GET", &url)
/// .call()?; /// .call()?;

View File

@@ -424,7 +424,7 @@ impl Request {
/// let req = ureq::get("http://httpbin.org/get") /// let req = ureq::get("http://httpbin.org/get")
/// .query("foo", "bar"); /// .query("foo", "bar");
/// ///
/// assert_eq!(req.request_url().unwrap().host(), "httpbin.org"); /// assert_eq!(req.request_url()?.host(), "httpbin.org");
/// # Ok(()) /// # Ok(())
/// # } /// # }
/// ``` /// ```
@@ -490,7 +490,7 @@ impl RequestUrl {
/// .query("foo", "42") /// .query("foo", "42")
/// .query("foo", "43"); /// .query("foo", "43");
/// ///
/// assert_eq!(req.request_url().unwrap().query_pairs(), vec![ /// assert_eq!(req.request_url()?.query_pairs(), vec![
/// ("foo", "42"), /// ("foo", "42"),
/// ("foo", "43") /// ("foo", "43")
/// ]); /// ]);

View File

@@ -242,14 +242,15 @@ impl Response {
/// ///
/// ``` /// ```
/// use std::io::Read; /// use std::io::Read;
/// # fn main() -> Result<(), ureq::Error> { /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
/// # ureq::is_test(true); /// # ureq::is_test(true);
/// let resp = ureq::get("http://httpbin.org/bytes/100") /// let resp = ureq::get("http://httpbin.org/bytes/100")
/// .call()?; /// .call()?;
/// ///
/// assert!(resp.has("Content-Length")); /// assert!(resp.has("Content-Length"));
/// let len = resp.header("Content-Length") /// let len: usize = resp.header("Content-Length")
/// .and_then(|s| s.parse::<usize>().ok()).unwrap(); /// .unwrap()
/// .parse()?;
/// ///
/// let mut bytes: Vec<u8> = Vec::with_capacity(len); /// let mut bytes: Vec<u8> = Vec::with_capacity(len);
/// resp.into_reader() /// resp.into_reader()
@@ -632,15 +633,18 @@ impl FromStr for Response {
/// ///
/// Example: /// Example:
/// ``` /// ```
/// # fn main() -> Result<(), ureq::Error> {
/// let s = "HTTP/1.1 200 OK\r\n\ /// let s = "HTTP/1.1 200 OK\r\n\
/// X-Forwarded-For: 1.2.3.4\r\n\ /// X-Forwarded-For: 1.2.3.4\r\n\
/// Content-Type: text/plain\r\n\ /// Content-Type: text/plain\r\n\
/// \r\n\ /// \r\n\
/// Hello World!!!"; /// Hello World!!!";
/// let resp = s.parse::<ureq::Response>().unwrap(); /// let resp: ureq::Response = s.parse()?;
/// assert!(resp.has("X-Forwarded-For")); /// assert!(resp.has("X-Forwarded-For"));
/// let body = resp.into_string().unwrap(); /// let body = resp.into_string()?;
/// assert_eq!(body, "Hello World!!!"); /// assert_eq!(body, "Hello World!!!");
/// # Ok(())
/// # }
/// ``` /// ```
fn from_str(s: &str) -> Result<Self, Self::Err> { fn from_str(s: &str) -> Result<Self, Self::Err> {
let stream = Stream::from_vec(s.as_bytes().to_owned()); let stream = Stream::from_vec(s.as_bytes().to_owned());