fhtml-macros 0.6.1

Macro implementations for `fhtml`
Documentation
use proc_macro2::TokenStream;
use quote::ToTokens;
use syn::parse::Parse;
use syn::punctuated::Punctuated;
use syn::Expr;

#[cfg_attr(test, derive(Debug, PartialEq))]
pub(crate) struct DashIdent(pub Punctuated<syn::Ident, syn::Token![-]>);

#[cfg_attr(test, derive(Debug, PartialEq))]
pub(crate) struct Doctype;

#[derive(Clone)]
#[cfg_attr(test, derive(Debug, PartialEq))]
pub(crate) enum LitValue {
    LitStr(syn::LitStr),
    Expr(syn::Expr),
}

#[derive(Clone)]
#[cfg_attr(test, derive(Debug))]
pub(crate) enum PlaceholderValue {
    LitStr(syn::LitStr),
    Expr {
        value: Expr,
        specs: Option<TokenStream>,
    },
}

#[cfg_attr(test, derive(Debug, PartialEq))]
pub(crate) struct Attr<Value: Parse> {
    pub(crate) name: DashIdent,
    pub(crate) value: Value,
}

#[cfg_attr(test, derive(Debug, PartialEq))]
pub(crate) enum Tag<Value: Parse> {
    Opening {
        name: DashIdent,
        attrs: Vec<Attr<Value>>,
        #[allow(dead_code)]
        self_closing: bool,
    },
    Closing {
        name: DashIdent,
    },
}

#[cfg_attr(test, derive(Debug, PartialEq))]
pub(crate) enum Node<Value: Parse> {
    Doctype(Doctype),
    Tag(Tag<Value>),
    Value(Value),
}

impl ToTokens for LitValue {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        match self {
            LitValue::LitStr(x) => x.to_tokens(tokens),
            LitValue::Expr(x) => x.to_tokens(tokens),
        }
    }
}

impl From<PlaceholderValue> for LitValue {
    fn from(value: PlaceholderValue) -> Self {
        match value {
            PlaceholderValue::LitStr(value) => Self::LitStr(value),
            PlaceholderValue::Expr { value, .. } => Self::Expr(value),
        }
    }
}

impl<Value: Parse + Clone> Node<Value> {
    pub(crate) fn get_all_values(&self) -> Vec<Value> {
        let mut v = Vec::new();

        match self {
            #[rustfmt::skip]
            Node::Tag(Tag::Opening { attrs, .. }) => for attr in attrs {
                v.push(attr.value.clone());
            },
            Node::Value(value) => {
                v.push(value.clone());
            }
            _ => {}
        }

        v
    }
}