Skip to content

Commit

Permalink
Pleasing the 1.33.0 borrow checker.
Browse files Browse the repository at this point in the history
  • Loading branch information
o0Ignition0o committed Aug 16, 2019
1 parent 4e037c2 commit 3ec8a66
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 53 deletions.
39 changes: 0 additions & 39 deletions src/host.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,45 +24,6 @@ pub(crate) enum HostInternal {
Ipv6(Ipv6Addr),
}

#[cfg(feature = "serde")]
impl ::serde::Serialize for HostInternal {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: ::serde::Serializer,
{
// This doesn’t use `derive` because that involves
// large dependencies (that take a long time to build), and
// either Macros 1.1 which are not stable yet or a cumbersome build script.
//
// Implementing `Serializer` correctly for an enum is tricky,
// so let’s use existing enums that already do.
use std::net::IpAddr;
match *self {
HostInternal::None => None,
HostInternal::Domain => Some(None),
HostInternal::Ipv4(addr) => Some(Some(IpAddr::V4(addr))),
HostInternal::Ipv6(addr) => Some(Some(IpAddr::V6(addr))),
}
.serialize(serializer)
}
}

#[cfg(feature = "serde")]
impl<'de> ::serde::Deserialize<'de> for HostInternal {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
use std::net::IpAddr;
Ok(match ::serde::Deserialize::deserialize(deserializer)? {
None => HostInternal::None,
Some(None) => HostInternal::Domain,
Some(Some(IpAddr::V4(addr))) => HostInternal::Ipv4(addr),
Some(Some(IpAddr::V6(addr))) => HostInternal::Ipv6(addr),
})
}
}

impl<S> From<Host<S>> for HostInternal
where
S: ToString,
Expand Down
3 changes: 2 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2097,7 +2097,8 @@ impl Url {
// If it is the scheme's default
// We don't mind it silently failing
// If there was no port in the first place
let _ = self.set_port(self.port());
let previous_port = self.port();
let _ = self.set_port(previous_port);

Ok(())
}
Expand Down
29 changes: 16 additions & 13 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1236,12 +1236,13 @@ impl<'a> Parser<'a> {
}
}
}

let segment_before_slash = if ends_with_slash {
&self.serialization[segment_start..self.serialization.len() - 1]
// Going from &str to String to &str to please the 1.33.0 borrow checker
let before_slash_string = if ends_with_slash {
self.serialization[segment_start..self.serialization.len() - 1].to_owned()
} else {
&self.serialization[segment_start..self.serialization.len()]
self.serialization[segment_start..self.serialization.len()].to_owned()
};
let segment_before_slash: &str = &before_slash_string;
match segment_before_slash {
// If buffer is a double-dot path segment, shorten url’s path,
".." | "%2e%2e" | "%2e%2E" | "%2E%2e" | "%2E%2E" | "%2e." | "%2E." | ".%2e"
Expand Down Expand Up @@ -1316,16 +1317,18 @@ impl<'a> Parser<'a> {
if self.serialization.len() <= path_start {
return;
}
// If url’s scheme is "file", path’s size is 1, and path[0] is a normalized Windows drive letter, then return.
let segments: Vec<&str> = self.serialization[path_start..]
.split('/')
.filter(|s| !s.is_empty())
.collect();
if scheme_type.is_file()
&& segments.len() == 1
&& is_normalized_windows_drive_letter(segments[0])
{
return;
// If url’s scheme is "file", path’s size is 1, and path[0] is a normalized Windows drive letter, then return.
let segments: Vec<&str> = self.serialization[path_start..]
.split('/')
.filter(|s| !s.is_empty())
.collect();
if scheme_type.is_file()
&& segments.len() == 1
&& is_normalized_windows_drive_letter(segments[0])
{
return;
}
}
// Remove path’s last item.
self.pop_path(scheme_type, path_start);
Expand Down

0 comments on commit 3ec8a66

Please sign in to comment.