diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-03-11 17:38:08 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-03-11 17:38:08 +0800 |
| commit | 4effbd209edf96637d7da2b7d29ea1a6de3c637a (patch) | |
| tree | 397223a02b80b858ceb41af0126d0c9e731f2047 /systems/_framework/space_macro | |
| parent | 794316c6e925097ef6b87693b4a610b4563309e6 (diff) | |
Add config system and space macro with workspace dependencies
Diffstat (limited to 'systems/_framework/space_macro')
| -rw-r--r-- | systems/_framework/space_macro/Cargo.toml | 13 | ||||
| -rw-r--r-- | systems/_framework/space_macro/src/lib.rs | 60 |
2 files changed, 73 insertions, 0 deletions
diff --git a/systems/_framework/space_macro/Cargo.toml b/systems/_framework/space_macro/Cargo.toml new file mode 100644 index 0000000..dea3f21 --- /dev/null +++ b/systems/_framework/space_macro/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "space_macro" +version.workspace = true +edition = "2024" + +[lib] +proc-macro = true + +[dependencies] +syn.workspace = true +quote.workspace = true +proc-macro2.workspace = true +just_fmt.workspace = true diff --git a/systems/_framework/space_macro/src/lib.rs b/systems/_framework/space_macro/src/lib.rs new file mode 100644 index 0000000..7877181 --- /dev/null +++ b/systems/_framework/space_macro/src/lib.rs @@ -0,0 +1,60 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::{DeriveInput, parse_macro_input}; + +#[proc_macro_derive(SpaceRootTest)] +pub fn space_root_test_derive(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + + let name = &input.ident; + + let test_mod_name = syn::Ident::new( + &format!( + "test_{}_space_root", + just_fmt::snake_case!(name.to_string()) + ), + name.span(), + ); + + let expanded = quote! { + #[cfg(test)] + mod #test_mod_name { + use super::*; + use framework::space::Space; + use std::env::{current_dir, set_current_dir}; + use tokio::fs::{create_dir_all, remove_dir_all}; + + #[tokio::test] + async fn test_create_space() { + let temp_dir = current_dir().unwrap().join(".temp").join(stringify!(#name)); + remove_dir_all(&temp_dir).await.ok(); + create_dir_all(&temp_dir).await.unwrap(); + set_current_dir(&temp_dir).unwrap(); + + let space = Space::new(#name::default()); + + assert!(space.space_dir_current().is_err()); + + space.init_here().await.unwrap(); + + assert!(space.space_dir_current().is_ok()); + + let space_dir = space.space_dir_current().unwrap(); + let pattern = <#name as framework::space::SpaceRoot>::get_pattern(); + + match pattern { + framework::space::SpaceRootFindPattern::IncludeDotDir(dir_name) => { + let expected_dir = space_dir.join(dir_name); + assert!(expected_dir.exists(), "Space directory {:?} should exist", expected_dir); + } + framework::space::SpaceRootFindPattern::IncludeFile(file_name) => { + let expected_file = space_dir.join(file_name); + assert!(expected_file.exists(), "Space file {:?} should exist", expected_file); + } + } + } + } + }; + + TokenStream::from(expanded) +} |
