statue 0.3.1

Easier way to query selectors for static HTML pages.
Documentation
use proc_macro::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream, TokenTree};

use crate::elements::ElementKind;

#[derive(Clone, Copy)]
pub(crate) enum RetTyKind {
    T,
    RcT,
}

impl RetTyKind {
    fn fmt_as_ty(ts: &mut TokenStream, ret_ty: &RetTyKind, ident: &str) {
        match ret_ty {
            RetTyKind::T => ts.extend([
                TokenTree::Ident(Ident::new("web_sys", Span::call_site())),
                TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                TokenTree::Ident(Ident::new(ident, Span::call_site())),
            ]),
            RetTyKind::RcT => {
                ts.extend([
                    TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                    TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                    TokenTree::Ident(Ident::new("std", Span::call_site())),
                    TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                    TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                    TokenTree::Ident(Ident::new("rc", Span::call_site())),
                    TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                    TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                    TokenTree::Ident(Ident::new("Rc", Span::call_site())),
                    TokenTree::Punct(proc_macro::Punct::new('<', proc_macro::Spacing::Alone)),
                    TokenTree::Ident(Ident::new(ident, Span::call_site())),
                    TokenTree::Punct(proc_macro::Punct::new('>', proc_macro::Spacing::Alone)),
                ]);
            }
        }
    }

    pub(crate) fn fmt_as_concrete_ty(
        ts: &mut TokenStream,
        ret_ty: &RetTyKind,
        elem_kind: &ElementKind,
    ) {
        RetTyKind::fmt_as_ty(ts, ret_ty, elem_kind.to_web_sys_name())
    }

    pub(crate) fn fmt_as_inferred_ty(ts: &mut TokenStream, ret_ty: &RetTyKind) {
        match ret_ty {
            RetTyKind::T => ts.extend([TokenTree::Ident(Ident::new("_", Span::call_site()))]),
            RetTyKind::RcT => ts.extend([
                TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                TokenTree::Ident(Ident::new("std", Span::call_site())),
                TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                TokenTree::Ident(Ident::new("rc", Span::call_site())),
                TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                TokenTree::Punct(proc_macro::Punct::new(':', proc_macro::Spacing::Joint)),
                TokenTree::Ident(Ident::new("Rc", Span::call_site())),
                TokenTree::Punct(proc_macro::Punct::new('<', proc_macro::Spacing::Alone)),
                TokenTree::Ident(Ident::new("_", Span::call_site())),
                TokenTree::Punct(proc_macro::Punct::new('>', proc_macro::Spacing::Alone)),
            ]),
        }
    }

    pub(crate) fn extend_with_optional_into(ts: &mut TokenStream, ret_ty: &RetTyKind) {
        match ret_ty {
            RetTyKind::T => {}
            RetTyKind::RcT => ts.extend([
                TokenTree::Punct(Punct::new('.', Spacing::Alone)),
                TokenTree::Ident(Ident::new("into", Span::call_site())),
                TokenTree::Group(Group::new(Delimiter::Parenthesis, TokenStream::new())),
            ]),
        }
    }
}