@@ -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