aboutsummaryrefslogtreecommitdiff
path: root/server/src/frontend/pages/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/frontend/pages/mod.rs')
-rw-r--r--server/src/frontend/pages/mod.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/server/src/frontend/pages/mod.rs b/server/src/frontend/pages/mod.rs
new file mode 100644
index 0000000..a20fa0e
--- /dev/null
+++ b/server/src/frontend/pages/mod.rs
@@ -0,0 +1,69 @@
+use markup::Render;
+use rocket::{
+ http::ContentType,
+ response::{self, Responder},
+ Request, Response,
+};
+use std::{fmt::Display, io::Cursor};
+
+use self::layout::Layout;
+
+pub mod home;
+pub mod layout;
+pub mod node;
+
+pub struct HtmlTemplate<T>(pub String, pub T);
+
+impl<'r, T: Render> Responder<'r, 'static> for HtmlTemplate<T> {
+ fn respond_to(self, _: &'r Request<'_>) -> response::Result<'static> {
+ let mut out = String::new();
+ Layout {
+ title: self.0,
+ main: self.1,
+ }
+ .render(&mut out)
+ .unwrap();
+ Response::build()
+ .header(ContentType::HTML)
+ .streamed_body(Cursor::new(out))
+ .ok()
+ }
+}
+
+#[derive(Debug)]
+pub struct MyError(anyhow::Error);
+
+impl<'r> Responder<'r, 'static> for MyError {
+ fn respond_to(self, _: &'r Request<'_>) -> response::Result<'static> {
+ let mut out = String::new();
+ Layout {
+ title: "Error".to_string(),
+ main: markup::new! {
+ h2 { "An error occured. Nobody is sorry"}
+ pre.error { @format!("{:?}", self.0) }
+ },
+ }
+ .render(&mut out)
+ .unwrap();
+ Response::build()
+ .header(ContentType::HTML)
+ .streamed_body(Cursor::new(out))
+ .ok()
+ }
+}
+
+impl Display for MyError {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ self.0.fmt(f)
+ }
+}
+impl From<anyhow::Error> for MyError {
+ fn from(err: anyhow::Error) -> MyError {
+ MyError(err)
+ }
+}
+impl From<std::fmt::Error> for MyError {
+ fn from(err: std::fmt::Error) -> MyError {
+ MyError(anyhow::anyhow!("{err}"))
+ }
+}