rust-embed-for-web-impl 11.4.1

The proc-macro implementation of rust-embed-for-web.
Documentation
#[cfg(feature = "include-exclude")]
use globset::GlobMatcher;
use proc_macro2::TokenStream as TokenStream2;
use rust_embed_for_web_utils::Config;

use crate::embed::MakeEmbed;

impl MakeEmbed for Vec<String> {
    fn make_embed(&self) -> TokenStream2 {
        let v = self;
        quote! { &[#(#v),*] }
    }
}

#[cfg(feature = "include-exclude")]
impl MakeEmbed for Vec<GlobMatcher> {
    fn make_embed(&self) -> TokenStream2 {
        let patterns: Vec<String> = self.iter().map(|v| v.glob().to_string()).collect();
        patterns.make_embed()
    }
}

impl MakeEmbed for Config {
    fn make_embed(&self) -> TokenStream2 {
        let includes_embed = {
            #[cfg(feature = "include-exclude")]
            {
                let includes = self.get_includes();
                if includes.is_empty() {
                    quote! {}
                } else {
                    let includes = includes.make_embed();
                    quote! {
                        for ele in #includes {
                            config.add_include(ele.to_string());
                        }
                    }
                }
            }
            #[cfg(not(feature = "include-exclude"))]
            quote! {}
        };
        let excludes_embed = {
            #[cfg(feature = "include-exclude")]
            {
                let excludes = self.get_excludes();
                if excludes.is_empty() {
                    quote! {}
                } else {
                    let excludes = excludes.make_embed();
                    quote! {
                        for ele in #excludes {
                            config.add_exclude(ele.to_string());
                        }
                    }
                }
            }
            #[cfg(not(feature = "include-exclude"))]
            quote! {}
        };

        quote! {
            let mut config = rust_embed_for_web::utils::Config::new();
            #includes_embed
            #excludes_embed
            config
        }
    }
}

pub(crate) fn generate_dynamic_impl(
    ident: &syn::Ident,
    config: &Config,
    folder_path: &str,
    prefix: &str,
) -> TokenStream2 {
    let config = config.make_embed();

    quote! {
      impl #ident {
        fn get(path: &str) -> Option<rust_embed_for_web::DynamicFile> {
          let config = { #config };
          let path = path.strip_prefix(#prefix)?;
          if config.should_include(path) {
            let folder_path: std::path::PathBuf = std::convert::From::from(#folder_path);
            let combined_path = folder_path.join(path);
            rust_embed_for_web::DynamicFile::read_from_fs(combined_path).ok()
          } else {
            None
          }
        }
      }

      impl rust_embed_for_web::RustEmbed for #ident {
        type File = rust_embed_for_web::DynamicFile;

        fn get(file_path: &str) -> Option<Self::File> {
          #ident::get(file_path)
        }
      }
    }
}