use axum::{
Router,
routing::{get, post, put, patch, delete},
};
use super::version::ApiVersion;
pub struct VersionedRouter<S = ()> {
base_path: String,
routers: Vec<(ApiVersion, Router<S>)>,
}
impl<S: Clone + Send + Sync + 'static> VersionedRouter<S> {
pub fn new(base_path: impl Into<String>) -> Self {
Self {
base_path: base_path.into(),
routers: Vec::new(),
}
}
pub fn version(mut self, version: ApiVersion, router: Router<S>) -> Self {
self.routers.push((version, router));
self
}
pub fn build(self) -> Router<S> {
let mut router = Router::new();
for (version, version_router) in self.routers {
let path = format!("{}/{}", self.base_path, version.as_str());
router = router.nest(&path, version_router);
}
router
}
}
pub fn versioned_path(base: &str, version: ApiVersion) -> String {
format!("{}/{}", base, version.as_str())
}
pub fn versioned_resource_path(base: &str, version: ApiVersion, resource: &str) -> String {
format!("{}/{}/{}", base, version.as_str(), resource)
}