Skip to content

Commit 1e7bcea

Browse files
committed
implement auto-documenting routes
1 parent fe23eae commit 1e7bcea

File tree

7 files changed

+431
-2
lines changed

7 files changed

+431
-2
lines changed

core/codegen/src/attribute/route/mod.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,25 @@ 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 eligible_types = route.guards()
306+
.map(|guard| &guard.ty)
307+
.chain(ret_ty.as_ref().into_iter());
308+
309+
let schema = eligible_types.map(|ty| {
310+
define_spanned_export!(ty.span() => _doc);
311+
312+
quote_spanned!(ty.span() => #_doc::resolve_doc!(#ty))
313+
});
314+
315+
quote!(::std::vec![#(#schema),*])
316+
}
317+
299318
fn codegen_route(route: Route) -> Result<TokenStream> {
300319
use crate::exports::*;
301320

@@ -305,8 +324,9 @@ fn codegen_route(route: Route) -> Result<TokenStream> {
305324
let query_guards = query_decls(&route);
306325
let data_guard = route.data_guard.as_ref().map(data_guard_decl);
307326

308-
// Extract the sentinels from the route.
327+
// Extract the sentinels and schemas from the route.
309328
let sentinels = sentinels_expr(&route);
329+
let schemas = schemas_expr(&route);
310330

311331
// Gather info about the function.
312332
let (vis, handler_fn) = (&route.handler.vis, &route.handler);
@@ -319,6 +339,9 @@ fn codegen_route(route: Route) -> Result<TokenStream> {
319339
let rank = Optional(route.attr.rank);
320340
let format = Optional(route.attr.format.as_ref());
321341

342+
// Get the doc comment
343+
let docstring = &route.docstring;
344+
322345
Ok(quote! {
323346
#handler_fn
324347

@@ -353,6 +376,8 @@ fn codegen_route(route: Route) -> Result<TokenStream> {
353376
format: #format,
354377
rank: #rank,
355378
sentinels: #sentinels,
379+
schemas: #schemas,
380+
docstring: #docstring,
356381
}
357382
}
358383

core/codegen/src/attribute/route/parse.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ pub struct Route {
2929
pub handler: syn::ItemFn,
3030
/// The parsed arguments to the user's function.
3131
pub arguments: Arguments,
32+
/// The doc comment describing this route
33+
pub docstring: String,
3234
}
3335

3436
type ArgumentMap = IndexMap<Name, (syn::Ident, syn::Type)>;
@@ -209,9 +211,11 @@ impl Route {
209211
})
210212
.collect();
211213

214+
let docstring = String::from_attrs("doc", &handler.attrs)?.join("\n");
215+
212216
diags.head_err_or(Route {
213217
attr, path_params, query_params, data_guard, request_guards,
214-
handler, arguments,
218+
handler, arguments, docstring
215219
})
216220
}
217221
}

core/codegen/src/exports.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ define_exported_paths! {
7272
_route => ::rocket::route,
7373
_catcher => ::rocket::catcher,
7474
_sentinel => ::rocket::sentinel,
75+
_doc => ::rocket::doc,
7576
_log => ::rocket::log,
7677
_form => ::rocket::form::prelude,
7778
_http => ::rocket::http,

0 commit comments

Comments
 (0)