use std::path::Path;
use bytes::Bytes;
use serde_json::json;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ChangeType {
Css,
Script,
Html,
Other,
}
impl ChangeType {
pub fn from_path(path: &Path) -> Self {
match path.extension().and_then(|e| e.to_str()) {
Some("css") => ChangeType::Css,
Some("js" | "mjs") => ChangeType::Script,
Some("html" | "htm") => ChangeType::Html,
_ => ChangeType::Other,
}
}
pub fn as_str(&self) -> &'static str {
match self {
ChangeType::Css => "css",
ChangeType::Script => "script",
ChangeType::Html => "html",
ChangeType::Other => "other",
}
}
}
pub fn reload_event_frame(change_type: &ChangeType) -> Bytes {
let data = json!({ "type": change_type.as_str() });
let msg = format!(
"event: {}\ndata: {}\n\n",
change_type.as_str(),
data
);
Bytes::from(msg)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn reload_event_frame_formats_css_correctly() {
let frame = reload_event_frame(&ChangeType::Css);
let s = String::from_utf8(frame.to_vec()).unwrap();
assert_eq!(s, "event: css\ndata: {\"type\":\"css\"}\n\n");
}
#[test]
fn reload_event_frame_formats_script_correctly() {
let frame = reload_event_frame(&ChangeType::Script);
let s = String::from_utf8(frame.to_vec()).unwrap();
assert_eq!(s, "event: script\ndata: {\"type\":\"script\"}\n\n");
}
#[test]
fn reload_event_frame_formats_html_correctly() {
let frame = reload_event_frame(&ChangeType::Html);
let s = String::from_utf8(frame.to_vec()).unwrap();
assert_eq!(s, "event: html\ndata: {\"type\":\"html\"}\n\n");
}
#[test]
fn reload_event_frame_formats_other_correctly() {
let frame = reload_event_frame(&ChangeType::Other);
let s = String::from_utf8(frame.to_vec()).unwrap();
assert_eq!(s, "event: other\ndata: {\"type\":\"other\"}\n\n");
}
#[test]
fn change_type_from_path_css() {
assert_eq!(ChangeType::from_path(Path::new("style.css")), ChangeType::Css);
assert_eq!(ChangeType::from_path(Path::new("dir/main.css")), ChangeType::Css);
}
#[test]
fn change_type_from_path_script() {
assert_eq!(ChangeType::from_path(Path::new("app.js")), ChangeType::Script);
assert_eq!(ChangeType::from_path(Path::new("mod.mjs")), ChangeType::Script);
assert_eq!(ChangeType::from_path(Path::new("dir/lib.js")), ChangeType::Script);
}
#[test]
fn change_type_from_path_html() {
assert_eq!(ChangeType::from_path(Path::new("index.html")), ChangeType::Html);
assert_eq!(ChangeType::from_path(Path::new("page.htm")), ChangeType::Html);
assert_eq!(ChangeType::from_path(Path::new("dir/file.html")), ChangeType::Html);
}
#[test]
fn change_type_from_path_other() {
assert_eq!(ChangeType::from_path(Path::new("image.png")), ChangeType::Other);
assert_eq!(ChangeType::from_path(Path::new("data.json")), ChangeType::Other);
assert_eq!(ChangeType::from_path(Path::new("README")), ChangeType::Other);
}
}