update tests
This commit is contained in:
1 parent
58b74c1155
commit
35befa1784
12 files changed
+334
-236
No files matched your search
@@ -1,6 +1,6 @@
|
||||
use proc_macro2::TokenStream;
|
||||
use quote::{format_ident, quote};
|
||||
use syn::Ident;
|
||||
use syn::Path;
|
||||
|
||||
use crate::nest::{Nest, NestId};
|
||||
|
||||
@@ -9,8 +9,8 @@ pub struct LayoutId(pub usize);
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Layout {
|
||||
pub comp: Ident,
|
||||
pub props_name: Ident,
|
||||
pub comp: Path,
|
||||
pub props_name: Path,
|
||||
pub active_nests: Vec<NestId>,
|
||||
}
|
||||
|
||||
@@ -38,13 +38,20 @@ impl Layout {
|
||||
pub fn parse(input: syn::parse::ParseStream, active_nests: Vec<NestId>) -> syn::Result<Self> {
|
||||
// Then parse the component name
|
||||
let _ = input.parse::<syn::Token![,]>();
|
||||
let comp: Ident = input.parse()?;
|
||||
let comp: Path = input.parse()?;
|
||||
|
||||
// Then parse the props name
|
||||
let _ = input.parse::<syn::Token![,]>();
|
||||
let props_name: Ident = input
|
||||
.parse()
|
||||
.unwrap_or_else(|_| format_ident!("{}Props", comp.to_string()));
|
||||
let props_name = input.parse::<Path>().unwrap_or_else(|_| {
|
||||
let last = format_ident!("{}Props", comp.segments.last().unwrap().ident.to_string());
|
||||
let mut segments = comp.segments.clone();
|
||||
segments.pop();
|
||||
segments.push(last.into());
|
||||
Path {
|
||||
leading_colon: None,
|
||||
segments,
|
||||
}
|
||||
});
|
||||
|
||||
Ok(Self {
|
||||
comp,
|
||||
|
||||
@@ -57,8 +57,6 @@ pub fn routable(input: TokenStream) -> TokenStream {
|
||||
dioxus_router::prelude::use_generic_router::<R>(cx)
|
||||
}
|
||||
|
||||
#route_enum
|
||||
|
||||
#error_type
|
||||
|
||||
#parse_impl
|
||||
@@ -296,9 +294,13 @@ impl RouteEnum {
|
||||
type Err = dioxus_router::routable::RouteParseError<#error_name>;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
let route = s.strip_prefix('/').unwrap_or(s);
|
||||
let route = s;
|
||||
let (route, query) = route.split_once('?').unwrap_or((route, ""));
|
||||
let mut segments = route.split('/');
|
||||
// skip the first empty segment
|
||||
if s.starts_with('/') {
|
||||
segments.next();
|
||||
}
|
||||
let mut errors = Vec::new();
|
||||
|
||||
#(#tokens)*
|
||||
@@ -427,21 +429,6 @@ impl RouteEnum {
|
||||
}
|
||||
}
|
||||
|
||||
impl ToTokens for RouteEnum {
|
||||
fn to_tokens(&self, tokens: &mut quote::__private::TokenStream) {
|
||||
let routes = &self.routes;
|
||||
|
||||
tokens.extend(quote!(
|
||||
|
||||
#[path = "pages"]
|
||||
mod pages {
|
||||
#(#routes)*
|
||||
}
|
||||
pub use pages::*;
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
struct SiteMapSegment {
|
||||
pub segment_type: SegmentType,
|
||||
pub children: Vec<SiteMapSegment>,
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
use quote::{format_ident, quote, ToTokens};
|
||||
use quote::{format_ident, quote};
|
||||
use syn::parse::Parse;
|
||||
use syn::parse::ParseStream;
|
||||
use syn::parse_quote;
|
||||
use syn::Path;
|
||||
use syn::{Ident, LitStr};
|
||||
|
||||
use proc_macro2::TokenStream as TokenStream2;
|
||||
@@ -16,8 +18,8 @@ use crate::segment::RouteSegment;
|
||||
|
||||
struct RouteArgs {
|
||||
route: LitStr,
|
||||
comp_name: Option<Ident>,
|
||||
props_name: Option<Ident>,
|
||||
comp_name: Option<Path>,
|
||||
props_name: Option<Path>,
|
||||
}
|
||||
|
||||
impl Parse for RouteArgs {
|
||||
@@ -40,10 +42,9 @@ impl Parse for RouteArgs {
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Route {
|
||||
pub file_based: bool,
|
||||
pub route_name: Ident,
|
||||
pub comp_name: Ident,
|
||||
pub props_name: Ident,
|
||||
pub comp_name: Path,
|
||||
pub props_name: Path,
|
||||
pub route: String,
|
||||
pub segments: Vec<RouteSegment>,
|
||||
pub query: Option<QuerySegment>,
|
||||
@@ -73,13 +74,20 @@ impl Route {
|
||||
let route_name = variant.ident.clone();
|
||||
let args = route_attr.parse_args::<RouteArgs>()?;
|
||||
let route = args.route.value();
|
||||
let file_based = args.comp_name.is_none();
|
||||
let comp_name = args
|
||||
.comp_name
|
||||
.unwrap_or_else(|| format_ident!("{}", route_name));
|
||||
let props_name = args
|
||||
.props_name
|
||||
.unwrap_or_else(|| format_ident!("{}Props", comp_name));
|
||||
let comp_name = args.comp_name.unwrap_or_else(|| parse_quote!(#route_name));
|
||||
let props_name = args.props_name.unwrap_or_else(|| {
|
||||
let last = format_ident!(
|
||||
"{}Props",
|
||||
comp_name.segments.last().unwrap().ident.to_string()
|
||||
);
|
||||
let mut segments = comp_name.segments.clone();
|
||||
segments.pop();
|
||||
segments.push(last.into());
|
||||
Path {
|
||||
leading_colon: None,
|
||||
segments,
|
||||
}
|
||||
});
|
||||
|
||||
let named_fields = match &variant.fields {
|
||||
syn::Fields::Named(fields) => fields,
|
||||
@@ -106,7 +114,6 @@ impl Route {
|
||||
route_name,
|
||||
segments: route_segments,
|
||||
route,
|
||||
file_based,
|
||||
query,
|
||||
nests,
|
||||
layouts,
|
||||
@@ -234,35 +241,3 @@ impl Route {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToTokens for Route {
|
||||
fn to_tokens(&self, tokens: &mut quote::__private::TokenStream) {
|
||||
if !self.file_based {
|
||||
return;
|
||||
}
|
||||
|
||||
let without_leading_slash = &self.route[1..];
|
||||
let route_path = std::path::Path::new(without_leading_slash);
|
||||
let with_extension = route_path.with_extension("rs");
|
||||
let dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
|
||||
let dir = std::path::Path::new(&dir);
|
||||
let route = dir.join("src").join("pages").join(with_extension.clone());
|
||||
|
||||
// check if the route exists or if not use the index route
|
||||
let route = if route.exists() && !without_leading_slash.is_empty() {
|
||||
with_extension.to_str().unwrap().to_string()
|
||||
} else {
|
||||
route_path.join("index.rs").to_str().unwrap().to_string()
|
||||
};
|
||||
|
||||
let route_name: Ident = self.route_name.clone();
|
||||
let prop_name = &self.props_name;
|
||||
|
||||
tokens.extend(quote!(
|
||||
#[path = #route]
|
||||
#[allow(non_snake_case)]
|
||||
mod #route_name;
|
||||
pub use #route_name::{#prop_name, #route_name};
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -291,13 +291,21 @@ impl<'a> RouteTreeSegmentData<'a> {
|
||||
enum_varient,
|
||||
},
|
||||
} => {
|
||||
let error_ident = static_segment_idx(*index);
|
||||
|
||||
let children = children.iter().map(|child| {
|
||||
let child = tree.get(*child).unwrap();
|
||||
child.to_tokens(nests, tree, enum_name.clone(), error_enum_name.clone())
|
||||
});
|
||||
|
||||
if segment.is_empty() {
|
||||
return quote! {
|
||||
{
|
||||
#(#children)*
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
let error_ident = static_segment_idx(*index);
|
||||
|
||||
quote! {
|
||||
{
|
||||
let mut segments = segments.clone();
|
||||
|
||||
Reference in new issue
Block a user