@@ -296,6 +296,38 @@ fn sentinels_expr(route: &Route) -> TokenStream {
296
296
quote ! ( :: std:: vec![ #( #sentinel) , * ] )
297
297
}
298
298
299
+ fn schemas_expr ( route : & Route ) -> TokenStream {
300
+ let ret_ty = match route. handler . sig . output {
301
+ syn:: ReturnType :: Default => None ,
302
+ syn:: ReturnType :: Type ( _, ref ty) => Some ( ty. with_stripped_lifetimes ( ) )
303
+ } ;
304
+
305
+ let generic_idents: Vec < _ > = route. handler . sig . generics
306
+ . type_params ( )
307
+ . map ( |p| & p. ident )
308
+ . collect ( ) ;
309
+
310
+ let eligible_types = route. guards ( )
311
+ . map ( |guard| & guard. ty )
312
+ . chain ( ret_ty. as_ref ( ) . into_iter ( ) )
313
+ . flat_map ( |ty| ty. unfold ( ) )
314
+ . filter ( |ty| ty. is_concrete ( & generic_idents) )
315
+ . map ( |child| ( child. parent , child. ty ) ) ;
316
+
317
+ let sentinel = eligible_types. map ( |( parent, ty) | {
318
+ define_spanned_export ! ( ty. span( ) => _doc) ;
319
+
320
+ match parent {
321
+ Some ( p) if p. is_concrete ( & generic_idents) => {
322
+ quote_spanned ! ( ty. span( ) => #_doc:: resolve_doc!( #ty) )
323
+ }
324
+ Some ( _) | None => quote_spanned ! ( ty. span( ) => #_doc:: resolve_doc!( #ty) ) ,
325
+ }
326
+ } ) ;
327
+
328
+ quote ! ( :: std:: vec![ #( #sentinel) , * ] )
329
+ }
330
+
299
331
fn codegen_route ( route : Route ) -> Result < TokenStream > {
300
332
use crate :: exports:: * ;
301
333
@@ -305,8 +337,9 @@ fn codegen_route(route: Route) -> Result<TokenStream> {
305
337
let query_guards = query_decls ( & route) ;
306
338
let data_guard = route. data_guard . as_ref ( ) . map ( data_guard_decl) ;
307
339
308
- // Extract the sentinels from the route.
340
+ // Extract the sentinels and schemas from the route.
309
341
let sentinels = sentinels_expr ( & route) ;
342
+ let schemas = schemas_expr ( & route) ;
310
343
311
344
// Gather info about the function.
312
345
let ( vis, handler_fn) = ( & route. handler . vis , & route. handler ) ;
@@ -319,6 +352,9 @@ fn codegen_route(route: Route) -> Result<TokenStream> {
319
352
let rank = Optional ( route. attr . rank ) ;
320
353
let format = Optional ( route. attr . format . as_ref ( ) ) ;
321
354
355
+ // Get the doc comment
356
+ let docstring = & route. docstring ;
357
+
322
358
Ok ( quote ! {
323
359
#handler_fn
324
360
@@ -353,6 +389,8 @@ fn codegen_route(route: Route) -> Result<TokenStream> {
353
389
format: #format,
354
390
rank: #rank,
355
391
sentinels: #sentinels,
392
+ schemas: #schemas,
393
+ docstring: #docstring,
356
394
}
357
395
}
358
396
0 commit comments