@@ -296,6 +296,38 @@ fn sentinels_expr(route: &Route) -> TokenStream {
296296 quote ! ( :: std:: vec![ #( #sentinel) , * ] )
297297}
298298
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+
299331fn codegen_route ( route : Route ) -> Result < TokenStream > {
300332 use crate :: exports:: * ;
301333
@@ -305,8 +337,9 @@ fn codegen_route(route: Route) -> Result<TokenStream> {
305337 let query_guards = query_decls ( & route) ;
306338 let data_guard = route. data_guard . as_ref ( ) . map ( data_guard_decl) ;
307339
308- // Extract the sentinels from the route.
340+ // Extract the sentinels and schemas from the route.
309341 let sentinels = sentinels_expr ( & route) ;
342+ let schemas = schemas_expr ( & route) ;
310343
311344 // Gather info about the function.
312345 let ( vis, handler_fn) = ( & route. handler . vis , & route. handler ) ;
@@ -319,6 +352,9 @@ fn codegen_route(route: Route) -> Result<TokenStream> {
319352 let rank = Optional ( route. attr . rank ) ;
320353 let format = Optional ( route. attr . format . as_ref ( ) ) ;
321354
355+ // Get the doc comment
356+ let docstring = & route. docstring ;
357+
322358 Ok ( quote ! {
323359 #handler_fn
324360
@@ -353,6 +389,8 @@ fn codegen_route(route: Route) -> Result<TokenStream> {
353389 format: #format,
354390 rank: #rank,
355391 sentinels: #sentinels,
392+ schemas: #schemas,
393+ docstring: #docstring,
356394 }
357395 }
358396
0 commit comments