~repos /rust-embed

#rust#proc-macro#http

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.


a283b903 Tangent 128

6 years ago
Impl the RustEmbed trait on asset types
Files changed (2) hide show
  1. impl/src/lib.rs +16 -0
  2. tests/lib.rs +28 -0
impl/src/lib.rs CHANGED
@@ -44,6 +44,14 @@ fn generate_assets(ident: &syn::Ident, folder_path: String) -> quote::Tokens {
44
44
  get_files(String::from(#folder_path)).map(|e| std::borrow::Cow::from(e.rel_path))
45
45
  }
46
46
  }
47
+ impl rust_embed::RustEmbed for #ident {
48
+ fn get(&self, file_path: &str) -> Option<std::borrow::Cow<'static, [u8]>> {
49
+ #ident::get(file_path)
50
+ }
51
+ fn iter(&self) -> Box<dyn Iterator<Item = std::borrow::Cow<'static, str>>> {
52
+ Box::new(#ident::iter())
53
+ }
54
+ }
47
55
  }
48
56
  }
49
57
 
@@ -80,6 +88,14 @@ fn generate_assets(ident: &syn::Ident, folder_path: String) -> quote::Tokens {
80
88
  items.iter().map(|x| std::borrow::Cow::from(*x))
81
89
  }
82
90
  }
91
+ impl rust_embed::RustEmbed for #ident {
92
+ fn get(&self, file_path: &str) -> Option<std::borrow::Cow<'static, [u8]>> {
93
+ #ident::get(file_path)
94
+ }
95
+ fn iter(&self) -> Box<dyn Iterator<Item = std::borrow::Cow<'static, str>>> {
96
+ Box::new(#ident::iter())
97
+ }
98
+ }
83
99
  }
84
100
  }
85
101
 
tests/lib.rs CHANGED
@@ -31,3 +31,31 @@ fn iter_works() {
31
31
  }
32
32
  assert_eq!(num_files, 6);
33
33
  }
34
+
35
+ #[test]
36
+ fn trait_works_generic() {
37
+ trait_works_generic_helper(&Asset);
38
+ }
39
+ fn trait_works_generic_helper(folder: &impl rust_embed::RustEmbed) {
40
+ let mut num_files = 0;
41
+ for file in folder.iter() {
42
+ assert!(folder.get(file.as_ref()).is_some());
43
+ num_files += 1;
44
+ }
45
+ assert_eq!(num_files, 6);
46
+ assert!(folder.get("gg.html").is_none(), "gg.html should not exist");
47
+ }
48
+
49
+ #[test]
50
+ fn trait_works_object() {
51
+ trait_works_object_helper(&Asset);
52
+ }
53
+ fn trait_works_object_helper(folder: &dyn rust_embed::RustEmbed) {
54
+ let mut num_files = 0;
55
+ for file in folder.iter() {
56
+ assert!(folder.get(file.as_ref()).is_some());
57
+ num_files += 1;
58
+ }
59
+ assert_eq!(num_files, 6);
60
+ assert!(folder.get("gg.html").is_none(), "gg.html should not exist");
61
+ }