@@ -26,6 +26,27 @@ use syn::{
2626mod api_error;
2727mod derive_schema;
2828
29+ /// Determine the path to the RustAPI facade crate (`rustapi-rs`).
30+ ///
31+ /// This supports dependency renaming, for example:
32+ /// `api = { package = "rustapi-rs", version = "..." }`.
33+ fn get_rustapi_path ( ) -> proc_macro2:: TokenStream {
34+ let rustapi_rs_found = crate_name ( "rustapi-rs" ) . or_else ( |_| crate_name ( "rustapi_rs" ) ) ;
35+
36+ if let Ok ( found) = rustapi_rs_found {
37+ match found {
38+ FoundCrate :: Itself => quote ! { crate } ,
39+ FoundCrate :: Name ( name) => {
40+ let normalized = name. replace ( '-' , "_" ) ;
41+ let ident = syn:: Ident :: new ( & normalized, proc_macro2:: Span :: call_site ( ) ) ;
42+ quote ! { :: #ident }
43+ }
44+ }
45+ } else {
46+ quote ! { :: rustapi_rs }
47+ }
48+ }
49+
2950/// Derive macro for OpenAPI Schema trait
3051///
3152/// # Example
@@ -58,6 +79,7 @@ pub fn derive_schema(input: TokenStream) -> TokenStream {
5879#[ proc_macro_attribute]
5980pub fn schema ( _attr : TokenStream , item : TokenStream ) -> TokenStream {
6081 let input = parse_macro_input ! ( item as syn:: Item ) ;
82+ let rustapi_path = get_rustapi_path ( ) ;
6183
6284 let ( ident, generics) = match & input {
6385 syn:: Item :: Struct ( s) => ( & s. ident , & s. generics ) ,
@@ -90,10 +112,10 @@ pub fn schema(_attr: TokenStream, item: TokenStream) -> TokenStream {
90112 #input
91113
92114 #[ allow( non_upper_case_globals) ]
93- #[ :: rustapi_rs :: __private:: linkme:: distributed_slice( :: rustapi_rs :: __private:: AUTO_SCHEMAS ) ]
94- #[ linkme( crate = :: rustapi_rs :: __private:: linkme) ]
95- static #registrar_ident: fn ( & mut :: rustapi_rs :: __private:: rustapi_openapi:: OpenApiSpec ) =
96- |spec: & mut :: rustapi_rs :: __private:: rustapi_openapi:: OpenApiSpec | {
115+ #[ #rustapi_path :: __private:: linkme:: distributed_slice( #rustapi_path :: __private:: AUTO_SCHEMAS ) ]
116+ #[ linkme( crate = #rustapi_path :: __private:: linkme) ]
117+ static #registrar_ident: fn ( & mut #rustapi_path :: __private:: rustapi_openapi:: OpenApiSpec ) =
118+ |spec: & mut #rustapi_path :: __private:: rustapi_openapi:: OpenApiSpec | {
97119 spec. register_in_place:: <#ident>( ) ;
98120 } ;
99121 } ;
@@ -439,6 +461,7 @@ pub fn main(_attr: TokenStream, item: TokenStream) -> TokenStream {
439461fn generate_route_handler ( method : & str , attr : TokenStream , item : TokenStream ) -> TokenStream {
440462 let path = parse_macro_input ! ( attr as LitStr ) ;
441463 let input = parse_macro_input ! ( item as ItemFn ) ;
464+ let rustapi_path = get_rustapi_path ( ) ;
442465
443466 let fn_name = & input. sig . ident ;
444467 let fn_vis = & input. vis ;
@@ -470,12 +493,12 @@ fn generate_route_handler(method: &str, attr: TokenStream, item: TokenStream) ->
470493
471494 // Pick the right route helper function based on method
472495 let route_helper = match method {
473- "GET" => quote ! ( :: rustapi_rs :: get_route) ,
474- "POST" => quote ! ( :: rustapi_rs :: post_route) ,
475- "PUT" => quote ! ( :: rustapi_rs :: put_route) ,
476- "PATCH" => quote ! ( :: rustapi_rs :: patch_route) ,
477- "DELETE" => quote ! ( :: rustapi_rs :: delete_route) ,
478- _ => quote ! ( :: rustapi_rs :: get_route) ,
496+ "GET" => quote ! ( #rustapi_path :: get_route) ,
497+ "POST" => quote ! ( #rustapi_path :: post_route) ,
498+ "PUT" => quote ! ( #rustapi_path :: put_route) ,
499+ "PATCH" => quote ! ( #rustapi_path :: patch_route) ,
500+ "DELETE" => quote ! ( #rustapi_path :: delete_route) ,
501+ _ => quote ! ( #rustapi_path :: get_route) ,
479502 } ;
480503
481504 // Auto-detect path parameters from function arguments
@@ -567,30 +590,30 @@ fn generate_route_handler(method: &str, attr: TokenStream, item: TokenStream) ->
567590
568591 // Route info function - creates a Route for this handler
569592 #[ doc( hidden) ]
570- #fn_vis fn #route_fn_name( ) -> :: rustapi_rs :: Route {
593+ #fn_vis fn #route_fn_name( ) -> #rustapi_path :: Route {
571594 #route_helper( #path_value, #fn_name)
572595 #chained_calls
573596 }
574597
575598 // Auto-register route with linkme
576599 #[ doc( hidden) ]
577600 #[ allow( non_upper_case_globals) ]
578- #[ :: rustapi_rs :: __private:: linkme:: distributed_slice( :: rustapi_rs :: __private:: AUTO_ROUTES ) ]
579- #[ linkme( crate = :: rustapi_rs :: __private:: linkme) ]
580- static #auto_route_name: fn ( ) -> :: rustapi_rs :: Route = #route_fn_name;
601+ #[ #rustapi_path :: __private:: linkme:: distributed_slice( #rustapi_path :: __private:: AUTO_ROUTES ) ]
602+ #[ linkme( crate = #rustapi_path :: __private:: linkme) ]
603+ static #auto_route_name: fn ( ) -> #rustapi_path :: Route = #route_fn_name;
581604
582605 // Auto-register referenced schemas with linkme (best-effort)
583606 #[ doc( hidden) ]
584607 #[ allow( non_snake_case) ]
585- fn #schema_reg_fn_name( spec: & mut :: rustapi_rs :: __private:: rustapi_openapi:: OpenApiSpec ) {
608+ fn #schema_reg_fn_name( spec: & mut #rustapi_path :: __private:: rustapi_openapi:: OpenApiSpec ) {
586609 #( spec. register_in_place:: <#schema_types>( ) ; ) *
587610 }
588611
589612 #[ doc( hidden) ]
590613 #[ allow( non_upper_case_globals) ]
591- #[ :: rustapi_rs :: __private:: linkme:: distributed_slice( :: rustapi_rs :: __private:: AUTO_SCHEMAS ) ]
592- #[ linkme( crate = :: rustapi_rs :: __private:: linkme) ]
593- static #auto_schema_name: fn ( & mut :: rustapi_rs :: __private:: rustapi_openapi:: OpenApiSpec ) = #schema_reg_fn_name;
614+ #[ #rustapi_path :: __private:: linkme:: distributed_slice( #rustapi_path :: __private:: AUTO_SCHEMAS ) ]
615+ #[ linkme( crate = #rustapi_path :: __private:: linkme) ]
616+ static #auto_schema_name: fn ( & mut #rustapi_path :: __private:: rustapi_openapi:: OpenApiSpec ) = #schema_reg_fn_name;
594617 } ;
595618
596619 debug_output ( & format ! ( "{} {}" , method, path_value) , & expanded) ;
@@ -1638,6 +1661,7 @@ pub fn derive_typed_path(input: TokenStream) -> TokenStream {
16381661 let input = parse_macro_input ! ( input as DeriveInput ) ;
16391662 let name = & input. ident ;
16401663 let generics = & input. generics ;
1664+ let rustapi_path = get_rustapi_path ( ) ;
16411665 let ( impl_generics, ty_generics, where_clause) = generics. split_for_impl ( ) ;
16421666
16431667 // Find the #[typed_path("...")] attribute
@@ -1702,7 +1726,7 @@ pub fn derive_typed_path(input: TokenStream) -> TokenStream {
17021726 }
17031727
17041728 let expanded = quote ! {
1705- impl #impl_generics :: rustapi_rs :: prelude:: TypedPath for #name #ty_generics #where_clause {
1729+ impl #impl_generics #rustapi_path :: prelude:: TypedPath for #name #ty_generics #where_clause {
17061730 const PATH : & ' static str = #path;
17071731
17081732 fn to_uri( & self ) -> String {
0 commit comments