use std::sync::Arc;
use crate::proxy::{ProxyAction, ProxyRequest};
pub(crate) const DEFAULT_BIND_ADDR: &str = "127.0.0.1";
pub(crate) const DEFAULT_PORT: u16 = 3000;
pub type ProxyFn = Arc<dyn Fn(ProxyRequest<'_>) -> ProxyAction + Send + Sync + 'static>;
pub struct Application<S = ()> {
pub(crate) routes: crate::Routes<S>,
pub(crate) proxy: Option<ProxyFn>,
pub(crate) bind_address: String,
pub(crate) port: u16,
#[cfg(feature = "inertia")]
pub(crate) inertia_config: Option<crate::inertia::InertiaConfig>,
#[cfg(feature = "inertia")]
pub(crate) page_contracts: Option<crate::inertia::PageContracts>,
#[cfg(feature = "pages")]
pub(crate) pages: Option<crate::pages::Pages>,
#[cfg(feature = "pages")]
pub(crate) maintenance_guard: Option<crate::pages::MaintenanceGuard>,
#[cfg(feature = "db")]
pub(crate) database: Option<crate::db::DbConfig>,
#[cfg(feature = "cache")]
pub(crate) cache_config: Option<crate::cache::CacheConfig>,
#[cfg(feature = "storage")]
pub(crate) storage_config: Option<crate::storage::StorageConfig>,
#[cfg(feature = "mail")]
pub(crate) mail_config: Option<crate::mail::SmtpConfig>,
#[cfg(feature = "jobs")]
pub(crate) jobs_registry: Option<super::jobs_registry::JobsRegistry>,
#[cfg(feature = "jobs")]
pub(crate) worker_config: Option<crate::jobs::WorkerConfig>,
#[cfg(feature = "dx")]
pub(crate) error_mapping: Option<crate::pipeline::error_mapping::ErrorMapFn>,
#[cfg(feature = "dev-proxy")]
pub(crate) dev_proxy_endpoint: Option<crate::dev_proxy::endpoint::IpcEndpoint>,
}
impl Application<()> {
#[allow(clippy::new_ret_no_self)]
#[must_use]
pub fn new() -> crate::ApplicationBuilder<()> {
crate::ApplicationBuilder::new()
}
}
impl<S> Application<S> {
#[must_use]
pub fn bind_address(&self) -> &str {
&self.bind_address
}
#[must_use]
pub fn port(&self) -> u16 {
self.port
}
#[cfg(feature = "inertia")]
pub fn page_contracts(&self) -> Option<&crate::inertia::PageContracts> {
self.page_contracts.as_ref()
}
}
impl<S> Default for Application<S>
where
S: Clone + Send + Sync + 'static,
{
fn default() -> Self {
let (addr, port) = (DEFAULT_BIND_ADDR, DEFAULT_PORT);
Self {
routes: crate::Routes::new(),
proxy: None,
bind_address: addr.to_owned(),
port,
#[cfg(feature = "inertia")]
inertia_config: None,
#[cfg(feature = "inertia")]
page_contracts: None,
#[cfg(feature = "pages")]
pages: None,
#[cfg(feature = "pages")]
maintenance_guard: None,
#[cfg(feature = "db")]
database: None,
#[cfg(feature = "cache")]
cache_config: None,
#[cfg(feature = "storage")]
storage_config: None,
#[cfg(feature = "mail")]
mail_config: None,
#[cfg(feature = "jobs")]
jobs_registry: None,
#[cfg(feature = "jobs")]
worker_config: None,
#[cfg(feature = "dx")]
error_mapping: None,
#[cfg(feature = "dev-proxy")]
dev_proxy_endpoint: None,
}
}
}
impl<S> std::fmt::Debug for Application<S> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut d = f.debug_struct("Application");
d.field("bind_address", &self.bind_address)
.field("port", &self.port)
.field("has_proxy", &self.proxy.is_some());
#[cfg(feature = "inertia")]
d.field("has_inertia", &self.inertia_config.is_some());
#[cfg(feature = "inertia")]
d.field("has_page_contracts", &self.page_contracts.is_some());
#[cfg(feature = "pages")]
d.field("has_pages", &self.pages.is_some());
#[cfg(feature = "pages")]
d.field("has_maintenance", &self.maintenance_guard.is_some());
#[cfg(feature = "db")]
d.field("has_database", &self.database.is_some());
#[cfg(feature = "cache")]
d.field("has_cache", &self.cache_config.is_some());
#[cfg(feature = "storage")]
d.field("has_storage", &self.storage_config.is_some());
#[cfg(feature = "mail")]
d.field("has_mail", &self.mail_config.is_some());
#[cfg(feature = "jobs")]
d.field("has_jobs", &self.jobs_registry.is_some());
#[cfg(feature = "dx")]
d.field("has_error_mapping", &self.error_mapping.is_some());
d.finish()
}
}