~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.
4ef3a1d4
—
pyros2097 7 years ago
Merge pull request #20 from Mcat12/feature/stable-rust
- .travis.yml +7 -7
- Cargo.toml +7 -3
- examples/basic.rs +1 -2
- examples/rocket.rs +2 -2
- readme.md +7 -7
- src/lib.rs +5 -12
- tests/lib.rs +2 -3
.travis.yml
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
language: rust
|
|
2
2
|
sudo: false
|
|
3
3
|
dist: trusty
|
|
4
|
+
rust:
|
|
5
|
+
- stable
|
|
6
|
+
- nightly
|
|
4
7
|
|
|
5
8
|
cache:
|
|
6
9
|
cargo: true
|
|
7
10
|
|
|
8
11
|
matrix:
|
|
9
|
-
|
|
12
|
+
allow_failures:
|
|
10
|
-
|
|
13
|
+
- rust: nightly
|
|
11
14
|
|
|
12
15
|
script:
|
|
13
16
|
- |
|
|
14
|
-
cargo clean
|
|
15
|
-
cargo test --
|
|
17
|
+
cargo test --lib
|
|
16
|
-
cargo test --
|
|
18
|
+
cargo test --lib --release
|
|
17
|
-
cargo clean
|
|
18
19
|
cargo build --example basic
|
|
19
|
-
cargo clean
|
|
20
20
|
cargo build --release --example basic
|
Cargo.toml
CHANGED
|
@@ -18,13 +18,17 @@ syn = "0.11"
|
|
|
18
18
|
quote = "0.3"
|
|
19
19
|
walkdir = "2.1.4"
|
|
20
20
|
|
|
21
|
+
rocket = { version = "0.3.6", optional = true }
|
|
22
|
+
rocket_codegen = { version = "0.3.6", optional = true }
|
|
23
|
+
rocket_contrib = { version = "0.3.6", optional = true }
|
|
24
|
+
|
|
21
25
|
[dev-dependencies]
|
|
22
|
-
rocket = "0.3.6"
|
|
23
|
-
rocket_codegen = "0.3.6"
|
|
24
|
-
rocket_contrib = "0.3.6"
|
|
25
26
|
rouille = "2.1.0"
|
|
26
27
|
fern = "0.5"
|
|
27
28
|
|
|
29
|
+
[features]
|
|
30
|
+
nightly = ["rocket", "rocket_codegen", "rocket_contrib"]
|
|
31
|
+
|
|
28
32
|
[badges]
|
|
29
33
|
appveyor = { repository = "pyros2097/rust-embed" }
|
|
30
34
|
travis-ci = { repository = "pyros2097/rust-embed" }
|
examples/basic.rs
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
#![feature(attr_literals)]
|
|
2
1
|
#[macro_use]
|
|
3
2
|
extern crate rust_embed;
|
|
4
3
|
|
|
5
4
|
#[derive(RustEmbed)]
|
|
6
|
-
#[folder
|
|
5
|
+
#[folder = "examples/public/"]
|
|
7
6
|
struct Asset;
|
|
8
7
|
|
|
9
8
|
fn main() {
|
examples/rocket.rs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#![feature(test, plugin, decl_macro
|
|
1
|
+
#![feature(test, plugin, decl_macro)]
|
|
2
2
|
#![plugin(rocket_codegen)]
|
|
3
3
|
extern crate rocket;
|
|
4
4
|
extern crate rocket_contrib;
|
|
@@ -12,7 +12,7 @@ use rocket::response;
|
|
|
12
12
|
use rocket::http::{ContentType, Status};
|
|
13
13
|
|
|
14
14
|
#[derive(RustEmbed)]
|
|
15
|
-
#[folder
|
|
15
|
+
#[folder = "examples/public/"]
|
|
16
16
|
struct Asset;
|
|
17
17
|
|
|
18
18
|
#[get("/")]
|
readme.md
CHANGED
|
@@ -13,23 +13,18 @@ rust-embed="2.0.0"
|
|
|
13
13
|
## Documentation
|
|
14
14
|
Declare a struct name it Asset or something and add an attribute `folder` to it which has the path to your static folder.
|
|
15
15
|
```rust
|
|
16
|
-
#![feature(attr_literals)]
|
|
17
|
-
|
|
18
16
|
#[derive(RustEmbed)]
|
|
19
|
-
#[folder
|
|
17
|
+
#[folder = "examples/public/"]
|
|
20
18
|
struct Asset;
|
|
21
19
|
```
|
|
22
20
|
|
|
23
21
|
## Usage
|
|
24
22
|
```rust
|
|
25
|
-
#![feature(attr_literals)]
|
|
26
23
|
#[macro_use]
|
|
27
24
|
extern crate rust_embed;
|
|
28
|
-
#[macro_use]
|
|
29
|
-
extern crate log;
|
|
30
25
|
|
|
31
26
|
#[derive(RustEmbed)]
|
|
32
|
-
#[folder
|
|
27
|
+
#[folder = "examples/public/"]
|
|
33
28
|
struct Asset;
|
|
34
29
|
|
|
35
30
|
fn main() {
|
|
@@ -46,6 +41,11 @@ To run the example in dev mode where it reads from the fs,
|
|
|
46
41
|
To run the example in release mode where it reads from binary,
|
|
47
42
|
|
|
48
43
|
`cargo run --release --example basic`
|
|
44
|
+
|
|
45
|
+
Note: To run the `rocket` example, add the `nightly` feature flag and run on a nightly build:
|
|
46
|
+
|
|
47
|
+
`cargo +nightly run --example rocket --features nightly`
|
|
48
|
+
|
|
49
49
|
## Testing
|
|
50
50
|
debug: `cargo test --tests --lib`
|
|
51
51
|
|
src/lib.rs
CHANGED
|
@@ -76,7 +76,7 @@ fn generate_assets(ident: &syn::Ident, folder_path: String) -> quote::Tokens {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
fn help() {
|
|
79
|
-
panic!("#[derive(RustEmbed)] should contain one attribute like this #[folder
|
|
79
|
+
panic!("#[derive(RustEmbed)] should contain one attribute like this #[folder = \"examples/public/\"]");
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
fn impl_rust_embed(ast: &syn::DeriveInput) -> Tokens {
|
|
@@ -92,10 +92,10 @@ fn impl_rust_embed(ast: &syn::DeriveInput) -> Tokens {
|
|
|
92
92
|
help();
|
|
93
93
|
}
|
|
94
94
|
let value = &ast.attrs[0].value;
|
|
95
|
-
let
|
|
95
|
+
let literal_value = match value {
|
|
96
|
-
&MetaItem::
|
|
96
|
+
&MetaItem::NameValue(ref attr_name, ref value) => {
|
|
97
97
|
if attr_name == "folder" {
|
|
98
|
-
|
|
98
|
+
value
|
|
99
99
|
} else {
|
|
100
100
|
panic!("#[derive(RustEmbed)] attribute name must be folder");
|
|
101
101
|
}
|
|
@@ -104,14 +104,7 @@ fn impl_rust_embed(ast: &syn::DeriveInput) -> Tokens {
|
|
|
104
104
|
panic!("#[derive(RustEmbed)] attribute name must be folder");
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
|
-
let item = &items[0];
|
|
108
|
-
let lit = match item {
|
|
109
|
-
&NestedMetaItem::Literal(ref l) => l,
|
|
110
|
-
_ => {
|
|
111
|
-
panic!("Hello");
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
let folder_path = match
|
|
107
|
+
let folder_path = match literal_value {
|
|
115
108
|
&Lit::Str(ref val, _) => val.clone(),
|
|
116
109
|
_ => {
|
|
117
110
|
panic!("#[derive(RustEmbed)] attribute value must be a string literal");
|
tests/lib.rs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#![feature(attr_literals)]
|
|
2
1
|
#[macro_use]
|
|
3
2
|
extern crate rust_embed;
|
|
4
3
|
|
|
@@ -6,7 +5,7 @@ extern crate rust_embed;
|
|
|
6
5
|
#[cfg(debug_assertions)]
|
|
7
6
|
fn dev() {
|
|
8
7
|
#[derive(RustEmbed)]
|
|
9
|
-
#[folder
|
|
8
|
+
#[folder = "examples/public/"]
|
|
10
9
|
struct Asset;
|
|
11
10
|
|
|
12
11
|
match Asset::get("index.html") {
|
|
@@ -27,7 +26,7 @@ fn dev() {
|
|
|
27
26
|
#[cfg(not(debug_assertions))]
|
|
28
27
|
fn prod() {
|
|
29
28
|
#[derive(RustEmbed)]
|
|
30
|
-
#[folder
|
|
29
|
+
#[folder = "examples/public/"]
|
|
31
30
|
struct Asset;
|
|
32
31
|
|
|
33
32
|
match Asset::get("index.html") {
|