freya_router_macro/
layout.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use proc_macro2::TokenStream;
use quote::quote;
use syn::Path;

use crate::nest::{
    Nest,
    NestId,
};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct LayoutId(pub usize);

#[derive(Debug)]
pub struct Layout {
    pub comp: Path,
    pub active_nests: Vec<NestId>,
}

impl Layout {
    pub fn routable_match(&self, nests: &[Nest]) -> TokenStream {
        let comp_name = &self.comp;
        let dynamic_segments = self
            .active_nests
            .iter()
            .flat_map(|id| nests[id.0].dynamic_segments());

        quote! {
            rsx! {
                #comp_name { #(#dynamic_segments: #dynamic_segments,)* }
            }
        }
    }
}

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: Path = input.parse()?;

        Ok(Self { comp, active_nests })
    }
}