Router

Struct Router 

Source
pub struct Router<S = ()> { /* private fields */ }
Expand description

A drop-in replacement for axum::Router that adds OpenAPI documentation support.

This Router works seamlessly with handlers decorated with #[rovo] and provides a fluent API for building documented APIs with Swagger UI integration.

§Example

use rovo::{Router, rovo, routing::get, aide::axum::IntoApiResponse};
use rovo::aide::openapi::OpenApi;
use rovo::response::Json;

#[rovo]
async fn documented_handler() -> impl IntoApiResponse {
    Json(())
}

let mut api = OpenApi::default();
api.info.title = "My API".to_string();

let app = Router::new()
    .route("/documented", get(documented_handler))
    .with_oas(api);

Implementations§

Source§

impl<S> Router<S>
where S: Clone + Send + Sync + 'static,

Source

pub fn new() -> Self

Create a new Router

Source

pub fn route<M>(self, path: &str, method_router: M) -> Self
where M: Into<ApiMethodRouter<S>>,

Add a route to the router

Source

pub fn nest(self, path: &str, router: Self) -> Self

Nest another router at the given path

Source

pub fn with_oas(self, api: OpenApi) -> Self

Configure OpenAPI spec with default routes (/api.json and /api.yaml)

This automatically sets up endpoints for both JSON and YAML formats.

§Memory Efficiency

The OpenAPI spec is serialized to JSON and YAML at startup, then the original struct is dropped to minimize memory usage. Only the pre-serialized strings are kept in memory.

If you need runtime access to the OpenApi struct (e.g., in handlers via Extension<Arc<OpenApi>>), use finish_api_with_extension instead.

Source

pub fn with_oas_route(self, api: OpenApi, route: impl Into<String>) -> Self

Configure OpenAPI spec with custom base route

This sets up endpoints with the specified base route. For example, “/openapi” creates:

  • /openapi.json
  • /openapi.yaml
§Memory Efficiency

The OpenAPI spec is serialized to JSON and YAML at startup, then the original struct is dropped to minimize memory usage. Only the pre-serialized strings are kept in memory.

If you need runtime access to the OpenApi struct (e.g., in handlers via Extension<Arc<OpenApi>>), use finish_api_with_extension instead.

Source

pub fn with_state(self, state: S) -> Router
where S: Clone + Send + Sync + 'static,

Add state to the router and finalize the API

Source

pub fn finish(self) -> Router<S>
where S: Clone + Send + Sync + 'static,

Finalize the API without state

Source

pub fn finish_api(self, api: &mut OpenApi) -> Router<S>

Finish building the API and return an axum Router for further configuration

Source

pub fn finish_api_with_extension(self, api: OpenApi) -> Router<S>
where S: Clone + Send + Sync + 'static,

Finish the API with OpenAPI spec embedded via Extension layer

The spec is wrapped in Arc<OpenApi> for efficient sharing. Use this method when you need runtime access to the OpenAPI spec in your handlers.

§Example
use std::sync::Arc;
use axum::Extension;
use aide::openapi::OpenApi;

async fn handler(Extension(api): Extension<Arc<OpenApi>>) {
    // Access the OpenAPI spec at runtime
    println!("API title: {}", api.info.title);
}
§Note

This keeps the full OpenApi struct in memory. For large APIs where you don’t need runtime access, prefer using with_oas which only keeps pre-serialized strings in memory.

Source

pub fn into_inner(self) -> AideApiRouter<S>

Convert into the underlying aide ApiRouter

Trait Implementations§

Source§

impl<S> Default for Router<S>
where S: Clone + Send + Sync + 'static,

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<S> Freeze for Router<S>

§

impl<S = ()> !RefUnwindSafe for Router<S>

§

impl<S> Send for Router<S>

§

impl<S> Sync for Router<S>

§

impl<S> Unpin for Router<S>

§

impl<S = ()> !UnwindSafe for Router<S>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoApi for T

Source§

fn into_api<A>(self) -> UseApi<T, A>

into UseApi
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,