winget_types/shared/url/
mod.rs1mod copyright_url;
2mod license_url;
3mod package_url;
4mod publisher_support_url;
5mod publisher_url;
6mod release_notes_url;
7
8use core::{
9 fmt,
10 ops::{Deref, DerefMut},
11 str::FromStr,
12};
13
14pub use copyright_url::CopyrightUrl;
15pub use license_url::LicenseUrl;
16pub use package_url::PackageUrl;
17use percent_encoding::percent_decode_str;
18pub use publisher_support_url::PublisherSupportUrl;
19pub use publisher_url::PublisherUrl;
20pub use release_notes_url::ReleaseNotesUrl;
21use url::{ParseError, Url};
22
23#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
24#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25pub struct DecodedUrl(Url);
26
27impl FromStr for DecodedUrl {
28 type Err = ParseError;
29
30 fn from_str(s: &str) -> Result<Self, Self::Err> {
31 Url::parse(&percent_decode_str(s).decode_utf8_lossy()).map(DecodedUrl)
32 }
33}
34
35impl Default for DecodedUrl {
36 fn default() -> Self {
37 Self(Url::parse("https://example.com").unwrap_or_else(|_| unreachable!()))
38 }
39}
40
41impl Deref for DecodedUrl {
42 type Target = Url;
43
44 #[inline]
45 fn deref(&self) -> &Self::Target {
46 &self.0
47 }
48}
49
50impl DerefMut for DecodedUrl {
51 #[inline]
52 fn deref_mut(&mut self) -> &mut Self::Target {
53 &mut self.0
54 }
55}
56
57impl fmt::Display for DecodedUrl {
58 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
59 self.0.fmt(f)
60 }
61}