diff --git a/embd-macros/Cargo.toml b/embd-macros/Cargo.toml index 00919d8..58e0102 100644 --- a/embd-macros/Cargo.toml +++ b/embd-macros/Cargo.toml @@ -8,7 +8,7 @@ categories = [ "filesystem" ] authors = [ "RGBCube" ] version = "0.1.4" edition = "2021" -include = [ "src/**/*.rs", "README.md" ] +include = [ "src/**/*.rs", "../README.md" ] [package.metadata.docs.rs] rustc-args = [ "--cfg", "procmacro2_semver_exempt" ] diff --git a/embd-macros/README.md b/embd-macros/README.md deleted file mode 100644 index 160a42c..0000000 --- a/embd-macros/README.md +++ /dev/null @@ -1,68 +0,0 @@ -# embd-rs - -A super simple file and directory embedding crate, -that loads files from the filesystem on debug mode, -allowing for quick edit-and-test cycles without compilation. - -It is also super efficient, and does not heap allocate when the -files are embedded on release mode by utilizing `std::borrow::Cow`. - -On release mode it falls back to `include_str!`, `include_bytes!` -and our own custom `include_dir!`-like implementation. - -## Usage - -Add this to your Cargo.toml: - -```toml -[dependencies] -embd = "0.1" -``` - -Then you can use this crate like so: - -```rs -let contents: Cow<'_, str> = embd::string!("path/to/file.txt"); -let bytes: Cow<'_, [u8]> = embd::bytes!("path/to/image.png"); - -let dir: embd::Dir = embd::dir!("path/to"); -let files: Vec = dir.flatten(); -``` - -Note that you will need to enable the `procmacro2_semver_exempt` cfg -option to use this crate, you can enable it like so, by putting this in -`.cargo/config.toml` in the project root: - -```toml -[build] -rustflags = [ "--cfg", "procmacro2_semver_exempt" ] -``` - -## To-Do - -- [ ] Hot reloading of files in debug mode. -- [ ] Don't depend on `procmacro2_semver_exempt`. - -## License - -``` -Copyright (c) 2023-present RGBCube - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` diff --git a/embd-macros/src/lib.rs b/embd-macros/src/lib.rs index 898a55b..d78b135 100644 --- a/embd-macros/src/lib.rs +++ b/embd-macros/src/lib.rs @@ -74,7 +74,7 @@ fn dir_debug(path: &str) -> TokenStream { #[cfg(procmacro2_semver_exempt)] fn dir_release(input: TokenStream, path: &str) -> TokenStream { - let neighbor = TokenStream::from(input).span().source_file().path(); + let neighbor = input.span().source_file().path(); let base = neighbor.parent().expect("Failed to get the parent of file"); diff --git a/embd/Cargo.toml b/embd/Cargo.toml index 232b77a..875c631 100644 --- a/embd/Cargo.toml +++ b/embd/Cargo.toml @@ -8,7 +8,7 @@ categories = [ "filesystem" ] authors = [ "RGBCube" ] version = "0.1.4" edition = "2021" -include = [ "src/**/*.rs", "README.md" ] +include = [ "src/**/*.rs", "../README.md" ] [package.metadata.docs.rs] rustc-args = [ "--cfg", "procmacro2_semver_exempt" ] diff --git a/embd/README.md b/embd/README.md deleted file mode 100644 index 160a42c..0000000 --- a/embd/README.md +++ /dev/null @@ -1,68 +0,0 @@ -# embd-rs - -A super simple file and directory embedding crate, -that loads files from the filesystem on debug mode, -allowing for quick edit-and-test cycles without compilation. - -It is also super efficient, and does not heap allocate when the -files are embedded on release mode by utilizing `std::borrow::Cow`. - -On release mode it falls back to `include_str!`, `include_bytes!` -and our own custom `include_dir!`-like implementation. - -## Usage - -Add this to your Cargo.toml: - -```toml -[dependencies] -embd = "0.1" -``` - -Then you can use this crate like so: - -```rs -let contents: Cow<'_, str> = embd::string!("path/to/file.txt"); -let bytes: Cow<'_, [u8]> = embd::bytes!("path/to/image.png"); - -let dir: embd::Dir = embd::dir!("path/to"); -let files: Vec = dir.flatten(); -``` - -Note that you will need to enable the `procmacro2_semver_exempt` cfg -option to use this crate, you can enable it like so, by putting this in -`.cargo/config.toml` in the project root: - -```toml -[build] -rustflags = [ "--cfg", "procmacro2_semver_exempt" ] -``` - -## To-Do - -- [ ] Hot reloading of files in debug mode. -- [ ] Don't depend on `procmacro2_semver_exempt`. - -## License - -``` -Copyright (c) 2023-present RGBCube - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` diff --git a/embd/src/lib.rs b/embd/src/lib.rs index 54dcace..326a1d5 100644 --- a/embd/src/lib.rs +++ b/embd/src/lib.rs @@ -1,6 +1,8 @@ #![allow(unexpected_cfgs)] + use std::{ borrow::Cow, + collections::VecDeque, fs, path::Path, }; @@ -64,10 +66,8 @@ pub fn __bytes_runtime(neighbor: &str, path: &str) -> Vec { /// # Example /// /// ``` -/// fn main() { -/// // `assets/` is in the same directory as `src/` -/// let content: Cow<'static, [u8]> = embd::string!("../assets/icon.png"); -/// } +/// // `assets/` is in the same directory as `src/` +/// let content: Cow<'static, [u8]> = embd::string!("../assets/icon.png"); /// ``` #[macro_export] #[cfg(procmacro2_semver_exempt)] @@ -126,17 +126,19 @@ impl Dir { /// Collects all files from the directory into a vector. pub fn flatten(self) -> Vec { - let mut entries = Vec::new(); + let mut files = Vec::new(); + let mut dirs = VecDeque::from([self]); - for child in self.__children.into_owned() { - // TODO: Eliminate allocation. - match child { - DirEntry::File(file) => entries.push(file), - DirEntry::Dir(dir) => entries.append(&mut dir.flatten()), + while let Some(dir) = dirs.pop_front() { + for child in dir.__children.iter().cloned() { + match child { + DirEntry::File(file) => files.push(file), + DirEntry::Dir(dir) => dirs.push_back(dir), + } } } - entries + files } } @@ -228,9 +230,7 @@ pub fn __dir_runtime(neighbor: &str, path: &str) -> Dir { /// # Example /// /// ``` -/// fn main() { -/// let content: embd::Dir = embd::dir!("../assets"); -/// } +/// let content: embd::Dir = embd::dir!("../assets"); /// ``` #[cfg(procmacro2_semver_exempt)] pub use embd_macros::__dir as dir;