diff --git a/crates/axum_bundler/src/bundle.rs b/crates/axum_bundler/src/bundle.rs index ad2b3d8e..faa4d6c3 100644 --- a/crates/axum_bundler/src/bundle.rs +++ b/crates/axum_bundler/src/bundle.rs @@ -38,7 +38,11 @@ async fn catch_all(request: Request) -> Html { let req = tuono_lib::Request::new(pathname, headers); - let payload = tuono_lib::Payload::new(&req, "".to_string()).client_payload(); + + // TODO: remove unwrap + let payload = tuono_lib::Payload::new(&req, Box::new("")) + .client_payload() + .unwrap(); let result = ssr::Js::SSR.with(|ssr| ssr.borrow_mut().render_to_string(Some(&payload))); diff --git a/crates/tuono_lib/Cargo.toml b/crates/tuono_lib/Cargo.toml index 0572445e..7d7afac4 100644 --- a/crates/tuono_lib/Cargo.toml +++ b/crates/tuono_lib/Cargo.toml @@ -13,5 +13,6 @@ ssr_rs = "0.5.1" axum = "0.7.5" tuono_lib_macros = { path = "../tuono_lib_macros"} serde = { version = "1.0.202", features = ["derive"] } +erased-serde = "0.4.5" serde_json = "1.0" diff --git a/crates/tuono_lib/src/payload.rs b/crates/tuono_lib/src/payload.rs index 30b632e3..cb0e34ea 100644 --- a/crates/tuono_lib/src/payload.rs +++ b/crates/tuono_lib/src/payload.rs @@ -1,24 +1,25 @@ -use serde::Serialize; +use erased_serde::Serialize; +use serde::Serialize as SerdeSerialize; use crate::request::Location; use crate::Request; -#[derive(Serialize)] +#[derive(SerdeSerialize)] /// This is the data shared to the client pub struct Payload<'a> { router: Location<'a>, - props: String, + props: Box, } impl<'a> Payload<'a> { - pub fn new(req: &Request<'a>, props: String) -> Payload<'a> { + pub fn new(req: &Request<'a>, props: Box) -> Payload<'a> { Payload { router: req.location(), props, } } - pub fn client_payload(&self) -> String { - serde_json::to_string(&self).unwrap() + pub fn client_payload(&self) -> Result { + serde_json::to_string(&self) } } diff --git a/crates/tuono_lib/src/response.rs b/crates/tuono_lib/src/response.rs index 17abd054..88d0bf18 100644 --- a/crates/tuono_lib/src/response.rs +++ b/crates/tuono_lib/src/response.rs @@ -1,4 +1,6 @@ +use erased_serde::Serialize; + pub enum Response { Redirect(String), - Props(String), + Props(Box), } diff --git a/crates/tuono_lib_macros/src/handler.rs b/crates/tuono_lib_macros/src/handler.rs index c1844b1c..5ad7723c 100644 --- a/crates/tuono_lib_macros/src/handler.rs +++ b/crates/tuono_lib_macros/src/handler.rs @@ -19,17 +19,23 @@ pub fn handler_core(_args: TokenStream, item: TokenStream) -> TokenStream { let req = tuono_lib::Request::new(pathname, headers); - let props = #fn_name(&req); + let local_response = #fn_name(&req); - let payload = tuono_lib::Payload::new(&req, "".to_string()).client_payload(); + let res = match local_response{ + tuono_lib::Response::Props(val) => { - dbg!(&payload); + // TODO: remove unwrap + let payload = tuono_lib::Payload::new(&req, val).client_payload().unwrap(); - let res = match props { - tuono_lib::Response::Props(val) => tuono_lib::ssr::Js::SSR.with(|ssr| ssr.borrow_mut().render_to_string(Some(&payload))), + dbg!(&payload); + + tuono_lib::ssr::Js::SSR.with(|ssr| ssr.borrow_mut().render_to_string(Some(&payload))) + }, + /// TODO: handle here redirection and rewrite _ => Ok("500 Internal server error".to_string()) }; + match res { Ok(html) => Html(html), _ => Html("500 internal server error".to_string())