diff options
Diffstat (limited to 'src/resources/scripts.rs')
| -rw-r--r-- | src/resources/scripts.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/resources/scripts.rs b/src/resources/scripts.rs new file mode 100644 index 0000000..3e2d869 --- /dev/null +++ b/src/resources/scripts.rs @@ -0,0 +1,37 @@ +use std::path::{Path, PathBuf}; + +use actix_web::{get, http::StatusCode, web, HttpResponse, ResponseError}; +use exun::{Expect, ResultErrorExt}; +use raise::yeet; +use serde::Serialize; +use thiserror::Error; + +#[derive(Debug, Clone, Error, Serialize)] +pub enum LoadScriptError { + #[error("The requested script does not exist")] + FileNotFound(Box<Path>), +} + +impl ResponseError for LoadScriptError { + fn status_code(&self) -> StatusCode { + match self { + Self::FileNotFound(..) => StatusCode::NOT_FOUND, + } + } +} + +fn load(script: &str) -> Result<String, Expect<LoadScriptError>> { + let path = PathBuf::from(format!("static/scripts/{}.js", script)); + if !path.exists() { + yeet!(LoadScriptError::FileNotFound(path.into()).into()); + } + let js = std::fs::read_to_string(format!("static/scripts/{}.js", script)).unexpect()?; + Ok(js) +} + +#[get("/{script}.js")] +pub async fn get_js(script: web::Path<Box<str>>) -> Result<HttpResponse, LoadScriptError> { + let js = load(&script).map_err(|e| e.unwrap())?; + let response = HttpResponse::Ok().content_type("text/javascript").body(js); + Ok(response) +} |
