use std::path::Path;
use crate::error::{ServerError, ServerResult};
pub mod middleware_handler;
mod middleware_response;
pub use middleware_handler::MiddlewareHandler;
#[derive(Clone, Default)]
pub struct LoadedMiddlewares {
handlers: Vec<MiddlewareHandler>,
}
impl LoadedMiddlewares {
pub fn compile(
middleware_file_paths: &[String],
relative_dir_path: &str,
) -> ServerResult<Self> {
let mut handlers = Vec::with_capacity(middleware_file_paths.len());
for (idx, relative_path) in middleware_file_paths.iter().enumerate() {
let joined = Path::new(relative_dir_path).join(relative_path);
let path_str = joined.to_str().ok_or_else(|| ServerError::Io(
std::io::Error::new(
std::io::ErrorKind::InvalidData,
format!(
"middleware #{} path contains non-UTF-8 bytes: {}",
idx + 1,
joined.to_string_lossy(),
),
),
))?;
handlers.push(MiddlewareHandler::new(path_str)?);
}
Ok(Self { handlers })
}
pub fn len(&self) -> usize {
self.handlers.len()
}
pub fn is_empty(&self) -> bool {
self.handlers.is_empty()
}
pub fn iter(&self) -> std::slice::Iter<'_, MiddlewareHandler> {
self.handlers.iter()
}
}