~repos /tide-jsx

#rust#proc-macro#jsx

git clone https://pyrossh.dev/repos/tide-jsx.git

Tide + JSX



file:

impl/src/children.rs



use crate::child::Child;
use quote::{quote, ToTokens};
use syn::parse::{Parse, ParseStream, Result};
#[derive(Default)]
pub struct Children {
pub nodes: Vec<Child>,
}
impl Children {
pub fn new(nodes: Vec<Child>) -> Self {
Children { nodes }
}
pub fn len(&self) -> usize {
self.nodes.len()
}
pub fn as_option_of_tuples_tokens(&self) -> proc_macro2::TokenStream {
let children_quotes: Vec<_> = self
.nodes
.iter()
.map(|child| {
quote! { #child }
})
.collect();
match children_quotes.len() {
0 => quote! { Option::<()>::None },
1 => quote! { Some(#(#children_quotes),*) },
_ => {
let mut iter = children_quotes.iter();
let first = iter.next().unwrap();
let second = iter.next().unwrap();
let tuple_of_tuples = iter.fold(
quote!((#first, #second)),
|renderable, current| quote!((#renderable, #current)),
);
quote! { Some(#tuple_of_tuples) }
}
}
}
}
impl Parse for Children {
fn parse(input: ParseStream) -> Result<Self> {
let mut nodes = vec![];
while !input.peek(syn::Token![<]) || !input.peek2(syn::Token![/]) {
let child = input.parse::<Child>()?;
nodes.push(child);
}
Ok(Self::new(nodes))
}
}
impl ToTokens for Children {
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
self.as_option_of_tuples_tokens().to_tokens(tokens);
}
}