~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.
362cea10
—
Peter John 1 year ago
Merge pull request #245 from pyrossh/fixes_222
- examples/actix.rs +2 -2
- examples/axum-spa/main.rs +2 -2
- examples/axum.rs +2 -2
- examples/basic.rs +2 -2
- examples/poem.rs +1 -1
- examples/rocket.rs +2 -2
- examples/salvo.rs +1 -1
- examples/warp.rs +2 -2
- readme.md +7 -5
- rustfmt.toml +0 -4
- src/lib.rs +4 -2
- tests/include_exclude.rs +6 -6
- tests/interpolated_path.rs +3 -3
- tests/lib.rs +15 -3
- tests/metadata.rs +2 -2
- tests/metadata_only.rs +2 -2
- tests/mime_guess.rs +2 -2
- tests/path_traversal_attack.rs +3 -3
- tests/prefix.rs +2 -2
examples/actix.rs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
use actix_web::{web, App, HttpResponse, HttpServer, Responder};
|
|
2
2
|
use mime_guess::from_path;
|
|
3
|
-
use rust_embed::
|
|
3
|
+
use rust_embed::Embed;
|
|
4
4
|
|
|
5
|
-
#[derive(
|
|
5
|
+
#[derive(Embed)]
|
|
6
6
|
#[folder = "examples/public/"]
|
|
7
7
|
struct Asset;
|
|
8
8
|
|
examples/axum-spa/main.rs
CHANGED
|
@@ -3,12 +3,12 @@ use axum::{
|
|
|
3
3
|
response::{Html, IntoResponse, Response},
|
|
4
4
|
routing::Router,
|
|
5
5
|
};
|
|
6
|
-
use rust_embed::
|
|
6
|
+
use rust_embed::Embed;
|
|
7
7
|
use std::net::SocketAddr;
|
|
8
8
|
|
|
9
9
|
static INDEX_HTML: &str = "index.html";
|
|
10
10
|
|
|
11
|
-
#[derive(
|
|
11
|
+
#[derive(Embed)]
|
|
12
12
|
#[folder = "examples/axum-spa/assets/"]
|
|
13
13
|
struct Assets;
|
|
14
14
|
|
examples/axum.rs
CHANGED
|
@@ -3,7 +3,7 @@ use axum::{
|
|
|
3
3
|
response::{Html, IntoResponse, Response},
|
|
4
4
|
routing::{get, Router},
|
|
5
5
|
};
|
|
6
|
-
use rust_embed::
|
|
6
|
+
use rust_embed::Embed;
|
|
7
7
|
use std::net::SocketAddr;
|
|
8
8
|
|
|
9
9
|
#[tokio::main]
|
|
@@ -46,7 +46,7 @@ async fn not_found() -> Html<&'static str> {
|
|
|
46
46
|
Html("<h1>404</h1><p>Not Found</p>")
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
#[derive(
|
|
49
|
+
#[derive(Embed)]
|
|
50
50
|
#[folder = "examples/public/"]
|
|
51
51
|
struct Asset;
|
|
52
52
|
|
examples/basic.rs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
use rust_embed::
|
|
1
|
+
use rust_embed::Embed;
|
|
2
2
|
|
|
3
|
-
#[derive(
|
|
3
|
+
#[derive(Embed)]
|
|
4
4
|
#[folder = "examples/public/"]
|
|
5
5
|
struct Asset;
|
|
6
6
|
|
examples/poem.rs
CHANGED
|
@@ -14,7 +14,7 @@ async fn main() -> Result<(), std::io::Error> {
|
|
|
14
14
|
Ok(())
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
#[derive(rust_embed::
|
|
17
|
+
#[derive(rust_embed::Embed)]
|
|
18
18
|
#[folder = "examples/public/"]
|
|
19
19
|
struct Asset;
|
|
20
20
|
pub(crate) struct StaticEmbed;
|
examples/rocket.rs
CHANGED
|
@@ -3,13 +3,13 @@ extern crate rocket;
|
|
|
3
3
|
|
|
4
4
|
use rocket::http::ContentType;
|
|
5
5
|
use rocket::response::content::RawHtml;
|
|
6
|
-
use rust_embed::
|
|
6
|
+
use rust_embed::Embed;
|
|
7
7
|
|
|
8
8
|
use std::borrow::Cow;
|
|
9
9
|
use std::ffi::OsStr;
|
|
10
10
|
use std::path::PathBuf;
|
|
11
11
|
|
|
12
|
-
#[derive(
|
|
12
|
+
#[derive(Embed)]
|
|
13
13
|
#[folder = "examples/public/"]
|
|
14
14
|
struct Asset;
|
|
15
15
|
|
examples/salvo.rs
CHANGED
|
@@ -12,7 +12,7 @@ async fn main() -> Result<(), std::io::Error> {
|
|
|
12
12
|
Ok(())
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
#[derive(rust_embed::
|
|
15
|
+
#[derive(rust_embed::Embed)]
|
|
16
16
|
#[folder = "examples/public/"]
|
|
17
17
|
struct Asset;
|
|
18
18
|
|
examples/warp.rs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
use rust_embed::
|
|
1
|
+
use rust_embed::Embed;
|
|
2
2
|
use warp::{http::header::HeaderValue, path::Tail, reply::Response, Filter, Rejection, Reply};
|
|
3
3
|
|
|
4
|
-
#[derive(
|
|
4
|
+
#[derive(Embed)]
|
|
5
5
|
#[folder = "examples/public/"]
|
|
6
6
|
struct Asset;
|
|
7
7
|
|
readme.md
CHANGED
|
@@ -21,7 +21,7 @@ The path resolution works as follows:
|
|
|
21
21
|
- In `release` or when `debug-embed` feature is enabled, the folder path is resolved relative to where `Cargo.toml` is.
|
|
22
22
|
|
|
23
23
|
```rust
|
|
24
|
-
#[derive(
|
|
24
|
+
#[derive(Embed)]
|
|
25
25
|
#[folder = "examples/public/"]
|
|
26
26
|
struct Asset;
|
|
27
27
|
```
|
|
@@ -98,7 +98,7 @@ Always embed the files in the binary, even in debug mode.
|
|
|
98
98
|
Allow environment variables to be used in the `folder` path. Example:
|
|
99
99
|
|
|
100
100
|
```rust
|
|
101
|
-
#[derive(
|
|
101
|
+
#[derive(Embed)]
|
|
102
102
|
#[folder = "$CARGO_MANIFEST_DIR/foo"]
|
|
103
103
|
struct Asset;
|
|
104
104
|
```
|
|
@@ -116,7 +116,9 @@ Matching is done on relative file paths, via [`globset`].
|
|
|
116
116
|
Example:
|
|
117
117
|
|
|
118
118
|
```rust
|
|
119
|
+
use rust_embed::Embed;
|
|
120
|
+
|
|
119
|
-
#[derive(
|
|
121
|
+
#[derive(Embed)]
|
|
120
122
|
#[folder = "examples/public/"]
|
|
121
123
|
#[include = "*.html"]
|
|
122
124
|
#[include = "images/*"]
|
|
@@ -127,9 +129,9 @@ struct Asset;
|
|
|
127
129
|
## Usage
|
|
128
130
|
|
|
129
131
|
```rust
|
|
130
|
-
use rust_embed::
|
|
132
|
+
use rust_embed::Embed;
|
|
131
133
|
|
|
132
|
-
#[derive(
|
|
134
|
+
#[derive(Embed)]
|
|
133
135
|
#[folder = "examples/public/"]
|
|
134
136
|
#[prefix = "prefix/"]
|
|
135
137
|
struct Asset;
|
rustfmt.toml
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
unstable_features = false
|
|
2
|
-
wrap_comments = true
|
|
3
|
-
normalize_comments = true
|
|
4
1
|
merge_derives = true
|
|
5
2
|
fn_params_layout = "Compressed"
|
|
6
3
|
max_width = 160
|
|
7
4
|
tab_spaces = 2
|
|
8
|
-
indent_style = "Block"
|
|
9
5
|
reorder_imports = true
|
src/lib.rs
CHANGED
|
@@ -21,9 +21,9 @@ pub extern crate rust_embed_utils as utils;
|
|
|
21
21
|
///
|
|
22
22
|
/// This trait is meant to be derived like so:
|
|
23
23
|
/// ```
|
|
24
|
-
/// use rust_embed::
|
|
24
|
+
/// use rust_embed::Embed;
|
|
25
25
|
///
|
|
26
|
-
/// #[derive(
|
|
26
|
+
/// #[derive(Embed)]
|
|
27
27
|
/// #[folder = "examples/public/"]
|
|
28
28
|
/// struct Asset;
|
|
29
29
|
///
|
|
@@ -50,6 +50,8 @@ pub trait RustEmbed {
|
|
|
50
50
|
fn iter() -> Filenames;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
pub use RustEmbed as Embed;
|
|
54
|
+
|
|
53
55
|
/// An iterator over filenames.
|
|
54
56
|
///
|
|
55
57
|
/// This enum exists for optimization purposes, to avoid boxing the iterator in
|
tests/include_exclude.rs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
use rust_embed::
|
|
1
|
+
use rust_embed::Embed;
|
|
2
2
|
|
|
3
|
-
#[derive(
|
|
3
|
+
#[derive(Embed)]
|
|
4
4
|
#[folder = "examples/public/"]
|
|
5
5
|
struct AllAssets;
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ fn get_works() {
|
|
|
13
13
|
assert_eq!(AllAssets::iter().count(), 7);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
#[derive(
|
|
16
|
+
#[derive(Embed)]
|
|
17
17
|
#[folder = "examples/public/"]
|
|
18
18
|
#[include = "*.html"]
|
|
19
19
|
#[include = "images/*"]
|
|
@@ -27,7 +27,7 @@ fn including_some_assets_works() {
|
|
|
27
27
|
assert_eq!(IncludeSomeAssets::iter().count(), 4);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
#[derive(
|
|
30
|
+
#[derive(Embed)]
|
|
31
31
|
#[folder = "examples/public/"]
|
|
32
32
|
#[exclude = "*.html"]
|
|
33
33
|
#[exclude = "images/*"]
|
|
@@ -42,7 +42,7 @@ fn excluding_some_assets_works() {
|
|
|
42
42
|
assert_eq!(ExcludeSomeAssets::iter().count(), 3);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
#[derive(
|
|
45
|
+
#[derive(Embed)]
|
|
46
46
|
#[folder = "examples/public/"]
|
|
47
47
|
#[include = "images/*"]
|
|
48
48
|
#[exclude = "*.txt"]
|
|
@@ -55,7 +55,7 @@ fn exclude_has_higher_priority() {
|
|
|
55
55
|
assert_eq!(ExcludePriorityAssets::iter().count(), 2);
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
#[derive(
|
|
58
|
+
#[derive(Embed)]
|
|
59
59
|
#[folder = "examples/public/symlinks"]
|
|
60
60
|
#[include = "main.js"]
|
|
61
61
|
struct IncludeSymlink;
|
tests/interpolated_path.rs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
use rust_embed::
|
|
1
|
+
use rust_embed::Embed;
|
|
2
2
|
|
|
3
3
|
/// Test doc comment
|
|
4
|
-
#[derive(
|
|
4
|
+
#[derive(Embed)]
|
|
5
5
|
#[folder = "$CARGO_MANIFEST_DIR/examples/public/"]
|
|
6
6
|
struct Asset;
|
|
7
7
|
|
|
@@ -26,7 +26,7 @@ fn iter_works() {
|
|
|
26
26
|
fn trait_works_generic() {
|
|
27
27
|
trait_works_generic_helper::<Asset>();
|
|
28
28
|
}
|
|
29
|
-
fn trait_works_generic_helper<E: rust_embed::
|
|
29
|
+
fn trait_works_generic_helper<E: rust_embed::Embed>() {
|
|
30
30
|
let mut num_files = 0;
|
|
31
31
|
for file in E::iter() {
|
|
32
32
|
assert!(E::get(file.as_ref()).is_some());
|
tests/lib.rs
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
use rust_embed::RustEmbed;
|
|
1
|
+
use rust_embed::{Embed, RustEmbed};
|
|
2
2
|
|
|
3
3
|
/// Test doc comment
|
|
4
|
-
#[derive(
|
|
4
|
+
#[derive(Embed)]
|
|
5
5
|
#[folder = "examples/public/"]
|
|
6
6
|
struct Asset;
|
|
7
7
|
|
|
8
|
+
#[derive(RustEmbed)]
|
|
9
|
+
#[folder = "examples/public/"]
|
|
10
|
+
struct AssetOld;
|
|
11
|
+
|
|
8
12
|
#[test]
|
|
9
13
|
fn get_works() {
|
|
10
14
|
assert!(Asset::get("index.html").is_some(), "index.html should exist");
|
|
@@ -12,6 +16,14 @@ fn get_works() {
|
|
|
12
16
|
assert!(Asset::get("images/llama.png").is_some(), "llama.png should exist");
|
|
13
17
|
}
|
|
14
18
|
|
|
19
|
+
// Todo remove this test and rename RustEmbed trait to Embed on a new major release
|
|
20
|
+
#[test]
|
|
21
|
+
fn get_old_name_works() {
|
|
22
|
+
assert!(AssetOld::get("index.html").is_some(), "index.html should exist");
|
|
23
|
+
assert!(AssetOld::get("gg.html").is_none(), "gg.html should not exist");
|
|
24
|
+
assert!(AssetOld::get("images/llama.png").is_some(), "llama.png should exist");
|
|
25
|
+
}
|
|
26
|
+
|
|
15
27
|
/// Using Windows-style path separators (`\`) is acceptable
|
|
16
28
|
#[test]
|
|
17
29
|
fn get_windows_style() {
|
|
@@ -35,7 +47,7 @@ fn iter_works() {
|
|
|
35
47
|
fn trait_works_generic() {
|
|
36
48
|
trait_works_generic_helper::<Asset>();
|
|
37
49
|
}
|
|
38
|
-
fn trait_works_generic_helper<E: rust_embed::
|
|
50
|
+
fn trait_works_generic_helper<E: rust_embed::Embed>() {
|
|
39
51
|
let mut num_files = 0;
|
|
40
52
|
for file in E::iter() {
|
|
41
53
|
assert!(E::get(file.as_ref()).is_some());
|
tests/metadata.rs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
use rust_embed::{
|
|
1
|
+
use rust_embed::{Embed, EmbeddedFile};
|
|
2
2
|
use sha2::Digest;
|
|
3
3
|
use std::{fs, time::SystemTime};
|
|
4
4
|
|
|
5
|
-
#[derive(
|
|
5
|
+
#[derive(Embed)]
|
|
6
6
|
#[folder = "examples/public/"]
|
|
7
7
|
struct Asset;
|
|
8
8
|
|
tests/metadata_only.rs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
use rust_embed::{
|
|
1
|
+
use rust_embed::{Embed, EmbeddedFile};
|
|
2
2
|
|
|
3
|
-
#[derive(
|
|
3
|
+
#[derive(Embed)]
|
|
4
4
|
#[folder = "examples/public/"]
|
|
5
5
|
#[metadata_only = true]
|
|
6
6
|
struct Asset;
|
tests/mime_guess.rs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
use rust_embed::{
|
|
1
|
+
use rust_embed::{Embed, EmbeddedFile};
|
|
2
2
|
|
|
3
|
-
#[derive(
|
|
3
|
+
#[derive(Embed)]
|
|
4
4
|
#[folder = "examples/public/"]
|
|
5
5
|
struct Asset;
|
|
6
6
|
|
tests/path_traversal_attack.rs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
use rust_embed::
|
|
1
|
+
use rust_embed::Embed;
|
|
2
2
|
|
|
3
|
-
#[derive(
|
|
3
|
+
#[derive(Embed)]
|
|
4
4
|
#[folder = "examples/public/"]
|
|
5
5
|
struct Assets;
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ fn path_traversal_attack_fails() {
|
|
|
12
12
|
assert!(Assets::get("../basic.rs").is_none());
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
#[derive(
|
|
15
|
+
#[derive(Embed)]
|
|
16
16
|
#[folder = "examples/axum-spa/"]
|
|
17
17
|
struct AxumAssets;
|
|
18
18
|
|
tests/prefix.rs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
use rust_embed::
|
|
1
|
+
use rust_embed::Embed;
|
|
2
2
|
|
|
3
|
-
#[derive(
|
|
3
|
+
#[derive(Embed)]
|
|
4
4
|
#[folder = "examples/public/"]
|
|
5
5
|
#[prefix = "prefix/"]
|
|
6
6
|
struct Asset;
|