use crate::internal::actix::route::{Route, RouteWrapper};
use crate::internal::definition_holder::DefinitionHolder;
use actix_web::dev::HttpServiceFactory;
use apistos_models::components::Components;
use apistos_models::paths::PathItem;
use indexmap::IndexMap;
pub struct ServiceConfig<'a> {
pub(crate) item_map: IndexMap<String, PathItem>,
pub(crate) components: Vec<Components>,
inner: &'a mut actix_web::web::ServiceConfig,
}
impl<'a> From<&'a mut actix_web::web::ServiceConfig> for ServiceConfig<'a> {
fn from(cfg: &'a mut actix_web::web::ServiceConfig) -> Self {
ServiceConfig {
item_map: Default::default(),
components: Default::default(),
inner: cfg,
}
}
}
impl ServiceConfig<'_> {
pub fn route(&mut self, path: &str, route: Route) -> &mut Self {
let mut w = RouteWrapper::new(path, route);
w.update_path_items(&mut self.item_map);
self.components.extend(w.components());
self.inner.route(path, w.inner);
self
}
pub fn configure<F>(&mut self, f: F) -> &mut Self
where
F: FnOnce(&mut ServiceConfig),
{
f(self);
self
}
pub fn service<F>(&mut self, mut factory: F) -> &mut Self
where
F: DefinitionHolder + HttpServiceFactory + 'static,
{
factory.update_path_items(&mut self.item_map);
self.components.extend(factory.components());
self.inner.service(factory);
self
}
pub fn external_resource<N, U>(&mut self, name: N, url: U) -> &mut Self
where
N: AsRef<str>,
U: AsRef<str>,
{
self.inner.external_resource(name, url);
self
}
pub fn app_data<U: 'static>(&mut self, data: U) -> &mut Self {
self.inner.app_data(data);
self
}
}