use super::class::parse_class_string;
use super::runtime::generate_dynamic_class_code;
use super::tables::lookup_attr_method;
use crate::parser::RsxAttribute;
use proc_macro2::TokenStream;
use quote::quote;
pub(crate) fn generate_attr_methods(attr: &RsxAttribute, out: &mut Vec<TokenStream>) {
match attr {
RsxAttribute::Value { name, .. } if name == "id" => {}
RsxAttribute::Flag(name) => {
if name == "invisible" {
out.push(quote! { .visible(false) });
} else if name != "styled" {
out.push(quote! { .#name() });
}
}
RsxAttribute::Value { name, value } => {
if name == "class" {
if let syn::Expr::Lit(syn::ExprLit {
lit: syn::Lit::Str(lit_str),
..
}) = value
{
let s = lit_str.value();
out.extend(parse_class_string(&s));
return;
}
let dynamic_code = generate_dynamic_class_code(value);
out.push(quote! { .map(|__el| #dynamic_code) });
return;
}
let name_str = name.to_string();
if let Some(mapped) = lookup_attr_method(&name_str) {
let method_ident = syn::Ident::new(mapped, name.span());
out.push(quote! { .#method_ident(#value) });
return;
}
out.push(quote! { .#name(#value) });
}
RsxAttribute::When { condition, closure } => {
out.push(quote! { .when(#condition, #closure) });
}
RsxAttribute::WhenSome { option, closure } => {
out.push(quote! { .when_some(#option, #closure) });
}
}
}