summaryrefslogtreecommitdiff
path: root/src/modules/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/mod.rs')
-rw-r--r--src/modules/mod.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/modules/mod.rs b/src/modules/mod.rs
new file mode 100644
index 0000000..2bee8e3
--- /dev/null
+++ b/src/modules/mod.rs
@@ -0,0 +1,54 @@
+use crate::error::ServiceError;
+use crate::State;
+use accesslog::AccessLogKind;
+use auth::{basic::HttpBasicAuthKind, cookie::CookieAuthKind};
+use bytes::Bytes;
+use error::ErrorKind;
+use file::FileKind;
+use files::FilesKind;
+use futures::Future;
+use hosts::HostsKind;
+use http_body_util::combinators::BoxBody;
+use hyper::{body::Incoming, Request, Response};
+use proxy::ProxyKind;
+use serde_yaml::Value;
+use std::{net::SocketAddr, pin::Pin, sync::Arc};
+
+pub mod accesslog;
+pub mod auth;
+pub mod error;
+pub mod file;
+pub mod files;
+pub mod hosts;
+pub mod proxy;
+
+pub type NodeRequest = Request<Incoming>;
+pub type NodeResponse = Response<BoxBody<Bytes, ServiceError>>;
+
+pub static MODULES: &'static [&'static dyn NodeKind] = &[
+ &HttpBasicAuthKind,
+ &CookieAuthKind,
+ &ProxyKind,
+ &HostsKind,
+ &FilesKind,
+ &FileKind,
+ &AccessLogKind,
+ &ErrorKind,
+];
+
+pub struct NodeContext {
+ pub state: Arc<State>,
+ pub addr: SocketAddr,
+}
+
+pub trait NodeKind: Send + Sync + 'static {
+ fn name(&self) -> &'static str;
+ fn instanciate(&self, config: Value) -> anyhow::Result<Arc<dyn Node>>;
+}
+pub trait Node: Send + Sync + 'static {
+ fn handle<'a>(
+ &'a self,
+ context: &'a mut NodeContext,
+ request: NodeRequest,
+ ) -> Pin<Box<dyn Future<Output = Result<NodeResponse, ServiceError>> + Send + Sync + 'a>>;
+}