summaryrefslogtreecommitdiff
path: root/systems/asset/macros
diff options
context:
space:
mode:
Diffstat (limited to 'systems/asset/macros')
-rw-r--r--systems/asset/macros/Cargo.toml13
-rw-r--r--systems/asset/macros/src/lib.rs43
2 files changed, 56 insertions, 0 deletions
diff --git a/systems/asset/macros/Cargo.toml b/systems/asset/macros/Cargo.toml
new file mode 100644
index 0000000..d4142f2
--- /dev/null
+++ b/systems/asset/macros/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "asset_macros"
+version.workspace = true
+edition = "2024"
+
+[lib]
+proc-macro = true
+
+[dependencies]
+string_proc = { path = "../../../utils/string_proc" }
+syn = { version = "2.0", features = ["full", "extra-traits"] }
+quote = "1.0"
+proc-macro2 = "1.0"
diff --git a/systems/asset/macros/src/lib.rs b/systems/asset/macros/src/lib.rs
new file mode 100644
index 0000000..f186633
--- /dev/null
+++ b/systems/asset/macros/src/lib.rs
@@ -0,0 +1,43 @@
+use proc_macro::TokenStream;
+use quote::quote;
+use string_proc::snake_case;
+use syn::parse_macro_input;
+
+#[proc_macro_derive(RWDataTest)]
+pub fn rw_data_test_derive(input: TokenStream) -> TokenStream {
+ let input = parse_macro_input!(input as syn::DeriveInput);
+ let name = &input.ident;
+ let test_mod_name = syn::Ident::new(
+ &format!("{}_rw_test", snake_case!(name.to_string())),
+ name.span(),
+ );
+
+ let expanded = quote! {
+ #[cfg(test)]
+ mod #test_mod_name {
+ use super::*;
+ use asset::rw::RWData;
+
+ #[tokio::test]
+ async fn test() {
+ let temp_dir = std::env::current_dir().unwrap().join(".temp/");
+ tokio::fs::create_dir_all(&temp_dir)
+ .await
+ .expect("Create dir failed!");
+ let temp_file = temp_dir.join(stringify!(#name));
+
+ #name::write(#name::test_data(), &temp_file)
+ .await
+ .expect("Write test data failed!");
+
+ let read_data = #name::read(&temp_file)
+ .await
+ .expect("Re-read data failed!");
+
+ assert!(#name::verify_data(#name::test_data(), read_data));
+ }
+ }
+ };
+
+ TokenStream::from(expanded)
+}