Url decode routes (#1407)

* fix a few new clippy lints

* url decode routes

* fix catch all segments

* fix clippy
This commit is contained in:
ealmloff authored and GitHub committed 2023-09-06 12:56:43 -05:00
1 parent e8ea228759
commit c8127e164b
7 files changed
+60 -13

No files matched your search

+2 -1
View File
@@ -482,7 +482,8 @@ impl RouteEnum {
let route = s;
let (route, _hash) = route.split_once('#').unwrap_or((route, ""));
let (route, query) = route.split_once('?').unwrap_or((route, ""));
let mut segments = route.split('/');
let query = dioxus_router::exports::urlencoding::decode(query).unwrap_or(query.into());
let mut segments = route.split('/').map(|s| dioxus_router::exports::urlencoding::decode(s).unwrap_or(s.into()));
// skip the first empty segment
if s.starts_with('/') {
let _ = segments.next();
+1 -1
View File
@@ -14,7 +14,7 @@ impl QuerySegment {
let ident = &self.ident;
let ty = &self.ty;
quote! {
let #ident = <#ty as dioxus_router::routable::FromQuery>::from_query(query);
let #ident = <#ty as dioxus_router::routable::FromQuery>::from_query(&*query);
}
}
+6 -3
View File
@@ -312,7 +312,8 @@ impl<'a> RouteTreeSegmentData<'a> {
quote! {
{
let mut segments = segments.clone();
if let Some(segment) = segments.next() {
let segment = segments.next();
if let Some(segment) = segment.as_deref() {
if #segment == segment {
#(#children)*
}
@@ -369,7 +370,7 @@ impl<'a> RouteTreeSegmentData<'a> {
quote! {
let mut trailing = String::from("/");
for seg in segments.clone() {
trailing += seg;
trailing += &*seg;
trailing += "/";
}
trailing.pop();
@@ -506,7 +507,9 @@ fn return_constructed(
let remaining_segments = segments.clone();
let mut segments_clone = segments.clone();
let next_segment = segments_clone.next();
let next_segment = next_segment.as_deref();
let segment_after_next = segments_clone.next();
let segment_after_next = segment_after_next.as_deref();
match (next_segment, segment_after_next) {
// This is the last segment, return the parsed route
(None, _) | (Some(""), None) => {
@@ -516,7 +519,7 @@ fn return_constructed(
_ => {
let mut trailing = String::new();
for seg in remaining_segments {
trailing += seg;
trailing += &*seg;
trailing += "/";
}
trailing.pop();
+9 -4
View File
@@ -59,6 +59,7 @@ impl RouteSegment {
{
let mut segments = segments.clone();
let segment = segments.next();
let segment = segment.as_deref();
let parsed = if let Some(#segment) = segment {
Ok(())
} else {
@@ -80,7 +81,8 @@ impl RouteSegment {
quote! {
{
let mut segments = segments.clone();
let parsed = if let Some(segment) = segments.next() {
let segment = segments.next();
let parsed = if let Some(segment) = segment.as_deref() {
<#ty as dioxus_router::routable::FromRouteSegment>::from_route_segment(segment).map_err(|err| #error_enum_name::#error_enum_varient(#inner_parse_enum::#error_name(err)))
} else {
Err(#error_enum_name::#error_enum_varient(#inner_parse_enum::#missing_error_name))
@@ -100,9 +102,12 @@ impl RouteSegment {
quote! {
{
let parsed = {
let mut segments = segments.clone();
let segments: Vec<_> = segments.collect();
<#ty as dioxus_router::routable::FromRouteSegments>::from_route_segments(&segments).map_err(|err| #error_enum_name::#error_enum_varient(#inner_parse_enum::#error_name(err)))
let remaining_segments: Vec<_> = segments.collect();
let mut new_segments: Vec<&str> = Vec::new();
for segment in &remaining_segments {
new_segments.push(&*segment);
}
<#ty as dioxus_router::routable::FromRouteSegments>::from_route_segments(&new_segments).map_err(|err| #error_enum_name::#error_enum_varient(#inner_parse_enum::#error_name(err)))
};
match parsed {
Ok(#name) => {