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}