rs_url2json/
lib.rs

1use serde::Serialize;
2use url::Url;
3
4#[derive(Serialize)]
5pub struct JsonUrl {
6    pub scheme: String,
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub host: Option<String>,
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub port: Option<u16>,
11    pub path: String,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub query: Option<String>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub fragment: Option<String>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub domain: Option<String>,
18    pub origin: String,
19    pub query_pairs: Vec<(String, String)>,
20}
21
22impl From<&Url> for JsonUrl {
23    fn from(url: &Url) -> Self {
24        Self {
25            scheme: url.scheme().to_string(),
26            host: url.host_str().map(|h| h.to_string()),
27            port: url.port(),
28            path: url.path().to_string(),
29            query: url.query().map(|q| q.to_string()),
30            fragment: url.fragment().map(|f| f.to_string()),
31            domain: url.domain().map(|d| d.to_string()),
32            origin: url.origin().unicode_serialization(),
33            query_pairs: url
34                .query_pairs()
35                .map(|(k, v)| (k.into_owned(), v.into_owned()))
36                .collect(),
37        }
38    }
39}