1
0

layout.rs 974 B

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