~repos /rust-embed
git clone https://pyrossh.dev/repos/rust-embed.git
rust macro which loads files into the rust binary at compile time during release and loads the file from the fs during dev.
c3fab701
—
Peter John 6 years ago
Merge branch 'master' into fix-rustfmt
- impl/Cargo.toml +2 -2
- impl/src/lib.rs +22 -17
impl/Cargo.toml
CHANGED
|
@@ -16,8 +16,8 @@ proc-macro = true
|
|
|
16
16
|
[dependencies]
|
|
17
17
|
rust-embed-utils = { version = "5.0.0", path = "../utils"}
|
|
18
18
|
|
|
19
|
-
syn = "
|
|
19
|
+
syn = "1"
|
|
20
|
-
quote = "
|
|
20
|
+
quote = "1"
|
|
21
21
|
walkdir = "2.2.7"
|
|
22
22
|
|
|
23
23
|
[dependencies.shellexpand]
|
impl/src/lib.rs
CHANGED
|
@@ -9,12 +9,11 @@ extern crate shellexpand;
|
|
|
9
9
|
extern crate walkdir;
|
|
10
10
|
|
|
11
11
|
use proc_macro::TokenStream;
|
|
12
|
-
use quote::Tokens;
|
|
13
12
|
use std::path::Path;
|
|
14
|
-
use syn::
|
|
13
|
+
use syn::{export::TokenStream2, Data, DeriveInput, Fields, Lit, Meta};
|
|
15
14
|
|
|
16
15
|
#[cfg(all(debug_assertions, not(feature = "debug-embed")))]
|
|
17
|
-
fn generate_assets(ident: &syn::Ident, folder_path: String) ->
|
|
16
|
+
fn generate_assets(ident: &syn::Ident, folder_path: String) -> TokenStream2 {
|
|
18
17
|
quote! {
|
|
19
18
|
impl #ident {
|
|
20
19
|
pub fn get(file_path: &str) -> Option<std::borrow::Cow<'static, [u8]>> {
|
|
@@ -56,10 +55,10 @@ fn generate_assets(ident: &syn::Ident, folder_path: String) -> quote::Tokens {
|
|
|
56
55
|
}
|
|
57
56
|
|
|
58
57
|
#[cfg(any(not(debug_assertions), feature = "debug-embed"))]
|
|
59
|
-
fn generate_assets(ident: &syn::Ident, folder_path: String) ->
|
|
58
|
+
fn generate_assets(ident: &syn::Ident, folder_path: String) -> TokenStream2 {
|
|
60
59
|
extern crate rust_embed_utils;
|
|
61
60
|
|
|
62
|
-
let mut match_values = Vec::<
|
|
61
|
+
let mut match_values = Vec::<TokenStream2>::new();
|
|
63
62
|
let mut list_values = Vec::<String>::new();
|
|
64
63
|
|
|
65
64
|
for rust_embed_utils::FileEntry { rel_path, full_canonical_path } in rust_embed_utils::get_files(folder_path) {
|
|
@@ -102,22 +101,29 @@ fn generate_assets(ident: &syn::Ident, folder_path: String) -> quote::Tokens {
|
|
|
102
101
|
}
|
|
103
102
|
}
|
|
104
103
|
|
|
105
|
-
fn impl_rust_embed(ast: &syn::DeriveInput) ->
|
|
104
|
+
fn impl_rust_embed(ast: &syn::DeriveInput) -> TokenStream2 {
|
|
106
|
-
match ast.
|
|
105
|
+
match ast.data {
|
|
107
|
-
Body::Enum(_) => panic!("RustEmbed cannot be derived for enums"),
|
|
108
|
-
|
|
106
|
+
Data::Struct(ref data) => match data.fields {
|
|
109
|
-
|
|
107
|
+
Fields::Unit => {}
|
|
110
108
|
_ => panic!("RustEmbed can only be derived for unit structs"),
|
|
111
109
|
},
|
|
110
|
+
_ => panic!("RustEmbed can only be derived for unit structs"),
|
|
112
111
|
};
|
|
113
112
|
|
|
113
|
+
let attribute = ast
|
|
114
|
+
.attrs
|
|
115
|
+
.iter()
|
|
116
|
+
.find(|value| value.path.is_ident("folder"))
|
|
114
|
-
|
|
117
|
+
.expect("#[derive(RustEmbed)] should contain one attribute like this #[folder = \"examples/public/\"]");
|
|
118
|
+
let meta = attribute
|
|
119
|
+
.parse_meta()
|
|
120
|
+
.expect("#[derive(RustEmbed)] should contain one attribute like this #[folder = \"examples/public/\"]");
|
|
115
|
-
let literal_value = match
|
|
121
|
+
let literal_value = match meta {
|
|
116
|
-
|
|
122
|
+
Meta::NameValue(ref data) => &data.lit,
|
|
117
123
|
_ => panic!("#[derive(RustEmbed)] should contain one attribute like this #[folder = \"examples/public/\"]"),
|
|
118
124
|
};
|
|
119
125
|
let folder_path = match literal_value {
|
|
120
|
-
|
|
126
|
+
Lit::Str(ref val) => val.clone().value(),
|
|
121
127
|
_ => {
|
|
122
128
|
panic!("#[derive(RustEmbed)] attribute value must be a string literal");
|
|
123
129
|
}
|
|
@@ -148,8 +154,7 @@ fn impl_rust_embed(ast: &syn::DeriveInput) -> Tokens {
|
|
|
148
154
|
|
|
149
155
|
#[proc_macro_derive(RustEmbed, attributes(folder))]
|
|
150
156
|
pub fn derive_input_object(input: TokenStream) -> TokenStream {
|
|
151
|
-
let s = input.to_string();
|
|
152
|
-
let ast = syn::
|
|
157
|
+
let ast: DeriveInput = syn::parse(input).unwrap();
|
|
153
158
|
let gen = impl_rust_embed(&ast);
|
|
154
|
-
gen.
|
|
159
|
+
gen.into()
|
|
155
160
|
}
|