http_type/http_url/impl.rs
1use crate::*;
2
3/// Implements the `std::error::Error` trait for `HttpUrlError`.
4impl std::error::Error for HttpUrlError {}
5
6/// Implements the `Display` trait for `HttpUrlError`, allowing it to be formatted as a string.
7impl Display for HttpUrlError {
8 /// Formats the `HttpUrlError` variant into a human-readable string.
9 ///
10 /// # Arguments
11 ///
12 /// - `f` - The formatter to write the string into.
13 ///
14 /// # Returns
15 ///
16 /// A `fmt::Result` indicating success or failure of the formatting operation.
17 #[inline(always)]
18 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19 match self {
20 HttpUrlError::InvalidUrl => write!(f, "Invalid URL"),
21 HttpUrlError::Unknown => write!(f, "Unknown error"),
22 }
23 }
24}
25
26/// Converts a URL parse error to a `HttpUrlError`.
27///
28/// Maps URL parse errors to `InvalidUrl`.
29impl From<ParseError> for HttpUrlError {
30 /// Converts a URL parse error to a `HttpUrlError`.
31 ///
32 /// # Arguments
33 ///
34 /// - `ParseError`: The URL parse error to convert.
35 ///
36 /// # Returns
37 ///
38 /// - `HttpUrlError`: The corresponding error as `InvalidUrl`.
39 #[inline(always)]
40 fn from(_: ParseError) -> Self {
41 HttpUrlError::InvalidUrl
42 }
43}
44
45impl HttpUrlComponents {
46 /// Parses a URL string into its components.
47 ///
48 /// Extracts protocol, host, port, path, query and fragment from the URL string.
49 ///
50 /// # Arguments
51 ///
52 /// - `AsRef<str>` - The URL string to parse.
53 ///
54 /// # Returns
55 ///
56 /// - `Result<HttpUrlComponents, HttpUrlError>` - Either the parsed components or an error.
57 #[inline]
58 pub fn parse<U>(url: U) -> Result<Self, HttpUrlError>
59 where
60 U: AsRef<str>,
61 {
62 let parsed_url: Url = Url::parse(url.as_ref())?;
63 let res: Self = Self {
64 protocol: parsed_url
65 .scheme()
66 .to_string()
67 .parse::<Protocol>()
68 .unwrap_or_default(),
69 host: parsed_url.host_str().map(|h| h.to_string()),
70 port: parsed_url.port(),
71 path: Some(parsed_url.path().to_string()),
72 query: parsed_url.query().map(|q| q.to_string()),
73 fragment: parsed_url.fragment().map(|f| f.to_string()),
74 };
75 Ok(res)
76 }
77}