feat: Added option to rename struct in Lua

This commit is contained in:
2025-09-17 01:04:37 +02:00
parent cef241546e
commit 6086dec859
6 changed files with 72 additions and 2 deletions

View File

@@ -340,7 +340,7 @@ fn parse_fields(
Ok(fields)
}
#[proc_macro_derive(Typed, attributes(serde))]
#[proc_macro_derive(Typed, attributes(serde, typed))]
pub fn typed(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
@@ -352,6 +352,7 @@ pub fn typed(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
fn typed_inner(ast: DeriveInput) -> syn::Result<TokenStream2> {
let name = ast.ident;
let mut as_name = LitStr::new(&name.to_string(), name.span());
let mut case = None;
let mut tag = None;
@@ -388,11 +389,33 @@ fn typed_inner(ast: DeriveInput) -> syn::Result<TokenStream2> {
{
return Err(err);
}
if attr.path().is_ident("typed")
&& let Err(err) = attr.parse_nested_meta(|meta| {
if meta.path.is_ident("as") {
let value = meta.value()?;
as_name = value.parse()?;
Ok(())
} else {
Err(syn::Error::new(meta.path.span(), "Unknown attribute"))
}
})
{
return Err(err);
}
}
if as_name.value().is_empty() {
return Err(syn::Error::new(
as_name.span(),
"Name is not allowed to be empty",
));
}
let type_name_fn = quote! {
fn type_name() -> ::std::string::String {
stringify!(#name).to_string()
#as_name.to_string()
}
};

23
tests/rename.rs Normal file
View File

@@ -0,0 +1,23 @@
use lua_typed::Typed;
#[derive(Typed)]
#[typed(as = "Lua")]
struct Rust;
#[derive(Typed)]
struct Other {
pub rust: Rust,
}
#[test]
fn rename() {
insta::assert_snapshot!(<Rust as Typed>::generate_full().unwrap(), @"---@class Lua");
}
#[test]
fn rename_nested() {
insta::assert_snapshot!(<Other as Typed>::generate_full().unwrap(), @r"
---@class Other
---@field rust Lua
");
}

7
tests/ui/empty_rename.rs Normal file
View File

@@ -0,0 +1,7 @@
use lua_typed::Typed;
#[derive(Typed)]
#[typed(as = "")]
struct A;
fn main() {}

View File

@@ -0,0 +1,5 @@
error: Name is not allowed to be empty
--> tests/ui/empty_rename.rs:4:14
|
4 | #[typed(as = "")]
| ^^

View File

@@ -0,0 +1,7 @@
use lua_typed::Typed;
#[derive(Typed)]
#[typed(cool)]
struct A;
fn main() {}

View File

@@ -0,0 +1,5 @@
error: Unknown attribute
--> tests/ui/unknown_attribute.rs:4:9
|
4 | #[typed(cool)]
| ^^^^