Skip to main content

nova_boot_macros/
lib.rs

1//! Procedural macros used by Nova for defining REST controllers and
2//! request/response models. These helpers provide attribute macros like
3//! `get`, `post`, `rest_controller` and derive macros `NovaRequest` and
4//! `NovaResponse` used throughout the example and plugin crates.
5
6use proc_macro::TokenStream;
7
8mod routing;
9mod utils;
10
11#[allow(dead_code)]
12mod validation;
13
14/// Marks a struct as a Nova controller. The macro currently adds a
15/// `nova_metadata()` helper; route handlers are attached via `get/post/...`
16/// attributes on impl functions.
17#[proc_macro_attribute]
18pub fn rest_controller(_args: TokenStream, input: TokenStream) -> TokenStream {
19    utils::rest_controller(input)
20}
21
22/// Attach a GET route to a free function. Usage: `#[get("/path")]`.
23#[proc_macro_attribute]
24pub fn get(args: TokenStream, input: TokenStream) -> TokenStream {
25    routing::get(args, input)
26}
27
28/// Attach a POST route to a free function. Usage: `#[post("/path")]`.
29#[proc_macro_attribute]
30pub fn post(args: TokenStream, input: TokenStream) -> TokenStream {
31    routing::post(args, input)
32}
33
34/// Attach a PUT route to a free function. Usage: `#[put("/path")]`.
35#[proc_macro_attribute]
36pub fn put(args: TokenStream, input: TokenStream) -> TokenStream {
37    routing::put(args, input)
38}
39
40/// Attach a DELETE route to a free function. Usage: `#[delete("/path")]`.
41#[proc_macro_attribute]
42pub fn delete(args: TokenStream, input: TokenStream) -> TokenStream {
43    routing::delete(args, input)
44}
45
46/// Attach a PATCH route to a free function. Usage: `#[patch("/path")]`.
47#[proc_macro_attribute]
48pub fn patch(args: TokenStream, input: TokenStream) -> TokenStream {
49    routing::patch(args, input)
50}
51
52/// Derive macro to mark a type as a Nova request model.
53#[proc_macro_derive(NovaRequest)]
54pub fn request_model(input: TokenStream) -> TokenStream {
55    utils::request_model(input)
56}
57
58/// Derive macro to mark a type as a Nova response model.
59#[proc_macro_derive(NovaResponse)]
60pub fn response_model(input: TokenStream) -> TokenStream {
61    utils::response_model(input)
62}