#![warn(clippy::pedantic)]
#![allow(clippy::ref_option)]
#![allow(clippy::match_wildcard_for_single_variants)]
use proc_macro2::TokenStream;
use quote::quote;
use syn::{DeriveInput, parse_macro_input};
mod dynamic;
mod embedding;
mod parse;
use parse::parse_manifest_input;
fn internal_manifest_derive(input: DeriveInput) -> syn::Result<TokenStream> {
let settings = parse_manifest_input(&input)?;
let ident = input.ident;
let trait_impl = if settings.no_embedding {
dynamic::generate(&ident, &settings)
} else {
embedding::generate(&ident, &settings)?
};
Ok(quote! {
#trait_impl
impl ::vite_static::Boxed<'static> for #ident {
fn boxed(&self) -> Box<dyn ::vite_static::Manifest<'static>> {
Box::new(#ident)
}
}
})
}
#[proc_macro_derive(Manifest, attributes(vite_dist, no_embedding))]
pub fn manifest_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
match internal_manifest_derive(input) {
Ok(stream) => stream.into(),
Err(err) => proc_macro::TokenStream::from(err.to_compile_error()),
}
}