#[cfg(feature = "fs-service")]
pub mod fs;
#[cfg(feature = "proxy-service")]
pub mod proxy;
#[cfg(feature = "redirect-service")]
pub mod redirect;
#[cfg(feature = "return-service")]
pub mod ret;
#[cfg(feature = "router-service")]
pub mod router;
use serde::{Deserialize, Serialize};
use crate::target::{IntoTarget, Target};
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "service_type")]
pub enum BuiltinServiceConfig {
#[cfg(feature = "fs-service")]
ServeDir(fs::ServeDirConfig),
#[cfg(feature = "fs-service")]
ServeFile(fs::ServeFileConfig),
#[cfg(feature = "proxy-service")]
ProxyPass(proxy::ProxyPassConfig),
#[cfg(feature = "redirect-service")]
Redirect(redirect::RedirectConfig),
#[cfg(feature = "redirect-service")]
HostRedirect(redirect::RedirectConfig),
#[cfg(feature = "router-service")]
HostRouter(router::HostRouterConfig),
#[cfg(feature = "router-service")]
LocationRouter(router::LocationRouterConfig),
#[cfg(feature = "router-service")]
MethodRouter(router::MethodRouterConfig),
#[cfg(feature = "return-service")]
Return(ret::ReturnConfig),
}
pub fn service_config(cfg: serde_yaml::Value) -> anyhow::Result<Target> {
let target = match serde_yaml::from_value(cfg) {
Ok(builtin) => match builtin {
#[cfg(feature = "fs-service")]
BuiltinServiceConfig::ServeDir(config) => {
fs::serve_dir_from_config(config)?.into_target()
}
#[cfg(feature = "fs-service")]
BuiltinServiceConfig::ServeFile(config) => {
fs::serve_file_from_config(config)?.into_target()
}
#[cfg(feature = "proxy-service")]
BuiltinServiceConfig::ProxyPass(config) => proxy::from_config(config)?.into_target(),
#[cfg(feature = "redirect-service")]
BuiltinServiceConfig::Redirect(config) => {
redirect::simple_from_config(config)?.into_target()
}
#[cfg(feature = "redirect-service")]
BuiltinServiceConfig::HostRedirect(config) => {
redirect::host_from_config(config)?.into_target()
}
#[cfg(feature = "router-service")]
BuiltinServiceConfig::HostRouter(config) => {
router::host_router_from_config(config)?.into_target()
}
#[cfg(feature = "router-service")]
BuiltinServiceConfig::LocationRouter(config) => {
router::location_router_from_config(config)?.into_target()
}
#[cfg(feature = "router-service")]
BuiltinServiceConfig::MethodRouter(config) => {
router::method_router_from_config(config)?.into_target()
}
#[cfg(feature = "return-service")]
BuiltinServiceConfig::Return(config) => ret::from_config(config)?.into_target(),
},
Err(e) => anyhow::bail!("{}", e),
};
Ok(target)
}