freya_router_macro/
layout.rs1use proc_macro2::TokenStream;
2use quote::quote;
3use syn::Path;
4
5use crate::nest::{
6 Nest,
7 NestId,
8};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11pub struct LayoutId(pub usize);
12
13#[derive(Debug)]
14pub struct Layout {
15 pub comp: Path,
16 pub active_nests: Vec<NestId>,
17}
18
19impl Layout {
20 pub fn routable_match(&self, nests: &[Nest]) -> TokenStream {
21 let comp_name = &self.comp;
22 let dynamic_segments = self
23 .active_nests
24 .iter()
25 .flat_map(|id| nests[id.0].dynamic_segments());
26
27 quote! {
28 freya::prelude::Element::from(
29 #comp_name { #(#dynamic_segments: #dynamic_segments,)* }
30 )
31 }
32 }
33}
34
35impl Layout {
36 pub fn parse(input: syn::parse::ParseStream, active_nests: Vec<NestId>) -> syn::Result<Self> {
37 let _ = input.parse::<syn::Token![,]>();
39 let comp: Path = input.parse()?;
40
41 Ok(Self { comp, active_nests })
42 }
43}