#![warn(clippy::pedantic)]
#![allow(clippy::ref_option)]
use proc_macro::TokenStream;
use quote::quote;
use syn::{DeriveInput, parse_macro_input};
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 manifest = embedding::get_manifest(&settings.vite_dist.0)
.map_err(|err| syn::Error::new(settings.vite_dist.1, format!("{err:#}")))?;
let (key_output_pairs, chunks) = embedding::generate_manifest_data(&manifest);
let expanded = quote! {
const KEY_OUTPUT_PAIRS: &[(&str, &str)] = &[ #(#key_output_pairs),* ];
const CHUNKS: &[(&str, &::vite_static::StaticManifestChunk)] = &[ #(#chunks),* ];
impl ::vite_static::Manifest<'static> for #ident {
fn manifest_key_output_pairs(&self) -> &'static [(&'static str, &'static str)] {
KEY_OUTPUT_PAIRS
}
fn manifest_chunks(&self) -> &'static [(&'static str, &'static ::vite_static::StaticManifestChunk)] {
CHUNKS
}
fn boxed(&self) -> Box<dyn ::vite_static::Manifest<'static>> { Box::new(#ident) }
}
};
Ok(TokenStream::from(expanded))
}
#[proc_macro_derive(Manifest, attributes(vite_dist))]
pub fn manifest_derive(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
match internal_manifest_derive(input) {
Ok(stream) => stream,
Err(err) => TokenStream::from(err.to_compile_error()),
}
}