#![doc = include_str!("../README.md")]
use auto_di::{BoxFuture, Container, DiError};
use axum::Router;
pub use auto_route_macros::{controller, delete, get, head, options, patch, post, put};
#[doc(hidden)]
pub struct RouteDescriptor {
factory: for<'a> fn(&'a Container) -> BoxFuture<'a, Result<Router<()>, DiError>>,
}
impl RouteDescriptor {
#[doc(hidden)]
pub const fn new(
factory: for<'a> fn(&'a Container) -> BoxFuture<'a, Result<Router<()>, DiError>>,
) -> Self {
Self { factory }
}
}
inventory::collect!(RouteDescriptor);
pub async fn build_routes(container: &Container) -> Result<Router<()>, DiError> {
let mut router = Router::new();
for descriptor in inventory::iter::<RouteDescriptor> {
router = router.merge((descriptor.factory)(container).await?);
}
Ok(router)
}
pub async fn routes() -> Result<Router<()>, DiError> {
build_routes(auto_di::global_container()?).await
}
#[doc(hidden)]
pub mod __private {
pub use auto_di;
pub use axum;
pub use inventory;
}