use file_ext::FileExt;
use crate::controller::Controller;
use crate::mime_type::MimeType;
use crate::range::Range;
use crate::request::{METHOD, Request};
use crate::response::{Response, STATUS_CODE_REASON_PHRASE};
use crate::server::ConnectionInfo;
#[cfg(test)]
mod tests;
pub struct DirectoryListingAssetsController;
impl DirectoryListingAssetsController {
pub const CSS_FILEPATH: &'static str = "rws-directory-listing.css";
pub const JS_FILEPATH: &'static str = "rws-directory-listing.js";
fn css_path() -> String {
format!("/{}", Self::CSS_FILEPATH)
}
fn js_path() -> String {
format!("/{}", Self::JS_FILEPATH)
}
fn serve(filepath: &'static str, embedded: &'static [u8], mime_type: &str, mut response: Response) -> Response {
response.status_code = *STATUS_CODE_REASON_PHRASE.n200_ok.status_code;
response.reason_phrase = STATUS_CODE_REASON_PHRASE.n200_ok.reason_phrase.to_string();
if FileExt::does_file_exist(filepath) {
let boxed_content_range = Range::get_content_range_of_a_file(filepath);
if boxed_content_range.is_ok() {
response.content_range_list = vec![boxed_content_range.unwrap()];
} else {
let error = boxed_content_range.err().unwrap();
let content_range = Range::get_content_range(
Vec::from(error.as_bytes()),
MimeType::TEXT_HTML.to_string(),
);
response.content_range_list = vec![content_range];
response.status_code = *STATUS_CODE_REASON_PHRASE.n500_internal_server_error.status_code;
response.reason_phrase = STATUS_CODE_REASON_PHRASE.n500_internal_server_error.reason_phrase.to_string();
}
} else {
let content_range = Range::get_content_range(embedded.to_vec(), mime_type.to_string());
response.content_range_list = vec![content_range];
}
response
}
}
impl Controller for DirectoryListingAssetsController {
fn is_matching(request: &Request, _connection: &ConnectionInfo) -> bool {
request.method == METHOD.get
&& (request.request_uri == Self::css_path() || request.request_uri == Self::js_path())
}
fn process(request: &Request, response: Response, _connection: &ConnectionInfo) -> Response {
if request.request_uri == Self::css_path() {
let embedded = include_bytes!("directory_listing.css");
Self::serve(Self::CSS_FILEPATH, embedded, MimeType::TEXT_CSS, response)
} else {
let embedded = include_bytes!("directory_listing.js");
Self::serve(Self::JS_FILEPATH, embedded, MimeType::TEXT_JAVASCRIPT, response)
}
}
}