~repos /rust-embed

#rust#proc-macro#http

git clone https://pyrossh.dev/repos/rust-embed.git
Discussions: https://groups.google.com/g/rust-embed-devs

rust macro which loads files into the rust binary at compile time during release and loads the file from the fs during dev.


Files changed (2) hide show
  1. readme.md +12 -1
  2. src/lib.rs +21 -18
readme.md CHANGED
@@ -27,12 +27,23 @@ It exposes a function to serve all files stored in your assets folder which is u
27
27
  system so that it doesn't take to much time to compile;]
28
28
 
29
29
  ```rust
30
- asset(path: String) -> Option<String>
30
+ asset(path: String) -> Option<Vec<u8>>
31
+
32
+ let asset = embed!("examples/public".to_owned());
33
+ match asset("/index.html".to_owned()) {
34
+ None => assert!(false, "index.html should exist"),
35
+ _ => assert!(true),
36
+ }
31
37
  ```
32
38
 
33
39
  ## Examples
34
40
  To run the examples,
35
41
  `cargo run --example hyper`
36
42
 
43
+ ## Testing
44
+ debug: `cargo test --lib -- --nocapture`
45
+
46
+ release: `cargo test --lib --release -- --nocapture`
47
+
37
48
  Go Rusketeers!
38
49
  The power is yours!
src/lib.rs CHANGED
@@ -3,26 +3,28 @@ extern crate log;
3
3
  extern crate walkdir;
4
4
 
5
5
  #[cfg(debug_assertions)]
6
- pub fn generate_assets(parent_path: String) -> Box<Fn(String) -> Option<String>> {
6
+ pub fn generate_assets(parent_path: String) -> Box<Fn(String) -> Option<Vec<u8>>> {
7
7
  use std::fs::File;
8
8
  use std::path::Path;
9
9
  use std::io::Read;
10
10
  info!("rust-embed: loading folder -> {}", parent_path);
11
11
  Box::new(move |file_path| {
12
- let path = format!("{}{}", parent_path, file_path);
12
+ let name = &format!("{}{}", parent_path, file_path);
13
+ let path = &Path::new(name);
14
+ let key = String::from(path.to_str().expect("Path does not have a string representation"));
13
- info!("rust-embed: asset from file -> {}", path);
15
+ info!("rust-embed: asset from file -> {}", key);
14
- let mut file = match File::open(&Path::new(&path)) {
16
+ let mut file = match File::open(path) {
15
17
  Ok(mut file) => file,
16
18
  Err(e) => {
17
- println!("rust-embed: could not open file -> {} {}", path, e);
19
+ error!("rust-embed: could not open file -> {} {}", key, e);
18
20
  return None
19
21
  }
20
22
  };
21
- let mut contents = String::new();
23
+ let mut data: Vec<u8> = Vec::new();
22
- match file.read_to_string(&mut contents) {
24
+ match file.read_to_end(&mut data) {
23
- Ok(_) => Some(contents),
25
+ Ok(_) => Some(data),
24
26
  Err(e) => {
25
- println!("rust-embed: could not open file -> {} {}", path, e);
27
+ error!("rust-embed: could not open file -> {} {}", key, e);
26
28
  return None
27
29
  }
28
30
  }
@@ -30,30 +32,31 @@ pub fn generate_assets(parent_path: String) -> Box<Fn(String) -> Option<String>>
30
32
  }
31
33
 
32
34
  #[cfg(not(debug_assertions))]
33
- pub fn generate_assets(parent_path: String) -> Box<Fn(String) -> Option<String>> {
35
+ pub fn generate_assets<'a>(parent_path: String) -> Box<Fn(String) -> Option<Vec<u8>>> {
34
36
  use std::fs::File;
35
37
  use std::io::Read;
36
38
  use std::path::Path;
37
39
  use walkdir::WalkDir;
38
40
  use std::collections::HashMap;
39
41
 
40
- println!("rust-embed: loading folder -> {}", parent_path);
42
+ info!("rust-embed: loading folder -> {}", parent_path);
41
43
  let mut map = HashMap::new();
42
- for entry in WalkDir::new(parent_path).into_iter().filter_map(|e| e.ok()).filter(|e| e.file_type().is_file()) {
44
+ for entry in WalkDir::new(parent_path.clone()).into_iter().filter_map(|e| e.ok()).filter(|e| e.file_type().is_file()) {
43
- println!("rust-embed: asset from file -> {}", entry.path().display());
45
+ info!("rust-embed: asset from file -> {}", entry.path().display());
46
+ let base = &parent_path.clone();
44
- let key = String::from(entry.path().to_str().expect("Path does not have a string representation"));
47
+ let key = String::from(entry.path().to_str().expect("Path does not have a string representation")).replace(base, "");
45
48
  let mut file = File::open(&Path::new(&entry.path())).unwrap_or_else(|e| {
46
49
  panic!("rust-embed: could not open file -> {} {}", key, e);
47
50
  });
48
- let mut contents = String::new();
51
+ let mut data: Vec<u8> = Vec::new();
49
- file.read_to_string(&mut contents).unwrap_or_else(|e| {
52
+ file.read_to_end(&mut data).unwrap_or_else(|e| {
50
53
  panic!("rust-embed: could not read file -> {} {}", key, e);
51
54
  });
52
- map.insert(key, contents);
55
+ map.insert(key, data);
53
56
  }
54
57
  Box::new(move |file_path| {
55
58
  match map.get(&file_path) {
56
- Some(s) => Some(s.to_string()),
59
+ Some(s) => Some(s.to_vec()),
57
60
  None => None,
58
61
  }
59
62
  })