@@ -79,13 +79,15 @@ pub fn route(attr: TokenStream, item: TokenStream) -> TokenStream {
7979///
8080/// Supports `#[schema(name = "CustomName")]` attribute to set custom `OpenAPI` schema name.
8181#[ cfg( not( tarpaulin_include) ) ]
82- #[ allow( clippy:: missing_panics_doc) ]
8382#[ proc_macro_derive( Schema , attributes( schema, serde) ) ]
8483pub fn derive_schema ( input : TokenStream ) -> TokenStream {
8584 let input = syn:: parse_macro_input!( input as syn:: DeriveInput ) ;
8685 let ( metadata, expanded) = schema_impl:: process_derive_schema ( & input) ;
8786 let name = metadata. name . clone ( ) ;
88- SCHEMA_STORAGE . lock ( ) . unwrap ( ) . insert ( name, metadata) ;
87+ SCHEMA_STORAGE
88+ . lock ( )
89+ . unwrap_or_else ( std:: sync:: PoisonError :: into_inner)
90+ . insert ( name, metadata) ;
8991 TokenStream :: from ( expanded)
9092}
9193
@@ -135,13 +137,14 @@ pub fn derive_schema(input: TokenStream) -> TokenStream {
135137/// let list_schema = schema!(User, pick = ["id", "name"]);
136138/// ```
137139#[ cfg( not( tarpaulin_include) ) ]
138- #[ allow( clippy:: missing_panics_doc) ]
139140#[ proc_macro]
140141pub fn schema ( input : TokenStream ) -> TokenStream {
141142 let input = syn:: parse_macro_input!( input as schema_macro:: SchemaInput ) ;
142143
143144 // Get stored schemas
144- let storage = SCHEMA_STORAGE . lock ( ) . unwrap ( ) ;
145+ let storage = SCHEMA_STORAGE
146+ . lock ( )
147+ . unwrap_or_else ( std:: sync:: PoisonError :: into_inner) ;
145148
146149 match schema_macro:: generate_schema_code ( & input, & storage) {
147150 Ok ( tokens) => TokenStream :: from ( tokens) ,
@@ -204,14 +207,15 @@ pub fn schema(input: TokenStream) -> TokenStream {
204207/// }
205208/// ```
206209#[ cfg( not( tarpaulin_include) ) ]
207- #[ allow( clippy:: missing_panics_doc) ]
208210#[ proc_macro]
209211pub fn schema_type ( input : TokenStream ) -> TokenStream {
210212 let input = syn:: parse_macro_input!( input as schema_macro:: SchemaTypeInput ) ;
211213
212214 // Get stored schemas and generate code
213215 let ( tokens, generated_metadata) = {
214- let storage = SCHEMA_STORAGE . lock ( ) . unwrap ( ) ;
216+ let storage = SCHEMA_STORAGE
217+ . lock ( )
218+ . unwrap_or_else ( std:: sync:: PoisonError :: into_inner) ;
215219 match schema_macro:: generate_schema_type_code ( & input, & storage) {
216220 Ok ( result) => result,
217221 Err ( e) => return e. to_compile_error ( ) . into ( ) ,
@@ -222,18 +226,22 @@ pub fn schema_type(input: TokenStream) -> TokenStream {
222226 // This ensures it appears in OpenAPI even when `ignore` is set
223227 if let Some ( metadata) = generated_metadata {
224228 let name = metadata. name . clone ( ) ;
225- SCHEMA_STORAGE . lock ( ) . unwrap ( ) . insert ( name, metadata) ;
229+ SCHEMA_STORAGE
230+ . lock ( )
231+ . unwrap_or_else ( std:: sync:: PoisonError :: into_inner)
232+ . insert ( name, metadata) ;
226233 }
227234 TokenStream :: from ( tokens)
228235}
229236
230237#[ cfg( not( tarpaulin_include) ) ]
231- #[ allow( clippy:: missing_panics_doc) ]
232238#[ proc_macro]
233239pub fn vespera ( input : TokenStream ) -> TokenStream {
234240 let input = syn:: parse_macro_input!( input as AutoRouterInput ) ;
235241 let processed = process_vespera_input ( input) ;
236- let schema_storage = SCHEMA_STORAGE . lock ( ) . unwrap ( ) ;
242+ let schema_storage = SCHEMA_STORAGE
243+ . lock ( )
244+ . unwrap_or_else ( std:: sync:: PoisonError :: into_inner) ;
237245
238246 match process_vespera_macro ( & processed, & schema_storage) {
239247 Ok ( tokens) => tokens. into ( ) ,
@@ -264,16 +272,24 @@ pub fn vespera(input: TokenStream) -> TokenStream {
264272/// ```
265273///
266274#[ cfg( not( tarpaulin_include) ) ]
267- #[ allow( clippy:: missing_panics_doc) ]
268275#[ proc_macro]
269276pub fn export_app ( input : TokenStream ) -> TokenStream {
270277 let ExportAppInput { name, dir } = syn:: parse_macro_input!( input as ExportAppInput ) ;
271278 let folder_name = dir
272279 . map ( |d| d. value ( ) )
273280 . or_else ( || std:: env:: var ( "VESPERA_DIR" ) . ok ( ) )
274281 . unwrap_or_else ( || "routes" . to_string ( ) ) ;
275- let schema_storage = SCHEMA_STORAGE . lock ( ) . unwrap ( ) ;
276- let manifest_dir = std:: env:: var ( "CARGO_MANIFEST_DIR" ) . expect ( "CARGO_MANIFEST_DIR not set" ) ;
282+ let schema_storage = SCHEMA_STORAGE
283+ . lock ( )
284+ . unwrap_or_else ( std:: sync:: PoisonError :: into_inner) ;
285+ let Ok ( manifest_dir) = std:: env:: var ( "CARGO_MANIFEST_DIR" ) else {
286+ return syn:: Error :: new (
287+ proc_macro2:: Span :: call_site ( ) ,
288+ "export_app! macro: CARGO_MANIFEST_DIR is not set. This macro must be used within a cargo build." ,
289+ )
290+ . to_compile_error ( )
291+ . into ( ) ;
292+ } ;
277293
278294 match process_export_app ( & name, & folder_name, & schema_storage, & manifest_dir) {
279295 Ok ( tokens) => tokens. into ( ) ,
0 commit comments