httproxide 0.2.0

Rusted HTTP router reverse-proxy
Documentation
#[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)
}