freya_router_macro/
layout.rs

1use 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        // Then parse the component name
38        let _ = input.parse::<syn::Token![,]>();
39        let comp: Path = input.parse()?;
40
41        Ok(Self { comp, active_nests })
42    }
43}