use std::sync::Arc;
use vetis::{
errors::{HandlerError, HostError, VetisError},
host::path::Path,
HandlerFn, Request, Response, VetisFutureResult,
};
pub struct HandlerPathBuilder {
uri: Arc<String>,
handler: Option<HandlerFn>,
}
impl HandlerPathBuilder {
pub fn uri(mut self, uri: &str) -> Self {
self.uri = Arc::from(uri.to_string());
self
}
pub fn handler(mut self, handler: HandlerFn) -> Self {
self.handler = Some(handler);
self
}
pub fn build(self) -> Result<HandlerPath, VetisError> {
if self.uri.is_empty() {
return Err(VetisError::Host(HostError::Handler(HandlerError::Uri(
"URI cannot be empty".to_string(),
))));
}
let handler = match self.handler {
Some(handler) => handler,
None => {
return Err(VetisError::Host(HostError::Handler(HandlerError::Handler(
"Handler must be set".to_string(),
))))
}
};
Ok(HandlerPath { uri: self.uri, handler })
}
}
pub struct HandlerPath {
uri: Arc<String>,
handler: HandlerFn,
}
impl HandlerPath {
pub fn builder() -> HandlerPathBuilder {
HandlerPathBuilder { uri: Arc::from("/".to_string()), handler: None }
}
}
impl Path for HandlerPath {
fn uri(&self) -> &str {
self.uri.as_ref()
}
fn handle<'a>(
&'a self,
request: Request,
_uri: Arc<String>,
) -> VetisFutureResult<'a, Response> {
(self.handler)(request)
}
}