2024-05-18 20:45:35 +02:00
|
|
|
use proc_macro::TokenStream;
|
|
|
|
|
use quote::quote;
|
|
|
|
|
use syn::{parse_macro_input, ItemFn};
|
|
|
|
|
|
|
|
|
|
pub fn handler_core(_args: TokenStream, item: TokenStream) -> TokenStream {
|
|
|
|
|
let item = parse_macro_input!(item as ItemFn);
|
|
|
|
|
|
|
|
|
|
let fn_name = item.clone().sig.ident;
|
|
|
|
|
|
|
|
|
|
quote! {
|
2024-05-20 21:07:37 +02:00
|
|
|
use axum::response::{Html, IntoResponse};
|
2024-05-30 21:03:25 +02:00
|
|
|
use axum::extract::State;
|
|
|
|
|
use reqwest::Client;
|
2024-05-18 20:45:35 +02:00
|
|
|
|
|
|
|
|
#item
|
|
|
|
|
|
2024-05-30 21:03:25 +02:00
|
|
|
pub async fn route(State(client): State<Client>, request: axum::extract::Request) -> Html<String> {
|
2024-05-19 12:22:56 +02:00
|
|
|
let pathname = &request.uri();
|
|
|
|
|
let headers = &request.headers();
|
|
|
|
|
|
|
|
|
|
let req = tuono_lib::Request::new(pathname, headers);
|
|
|
|
|
|
2024-05-30 21:03:25 +02:00
|
|
|
let local_response = #fn_name(req.clone(), client).await;
|
2024-05-19 12:22:56 +02:00
|
|
|
|
2024-05-30 21:03:25 +02:00
|
|
|
let res = match local_response {
|
2024-05-19 20:32:19 +02:00
|
|
|
tuono_lib::Response::Props(val) => {
|
2024-05-19 12:22:56 +02:00
|
|
|
|
2024-05-19 20:32:19 +02:00
|
|
|
// TODO: remove unwrap
|
|
|
|
|
let payload = tuono_lib::Payload::new(&req, val).client_payload().unwrap();
|
2024-05-18 20:45:35 +02:00
|
|
|
|
2024-05-19 20:32:19 +02:00
|
|
|
tuono_lib::ssr::Js::SSR.with(|ssr| ssr.borrow_mut().render_to_string(Some(&payload)))
|
|
|
|
|
},
|
|
|
|
|
/// TODO: handle here redirection and rewrite
|
2024-05-18 20:45:35 +02:00
|
|
|
_ => Ok("500 Internal server error".to_string())
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
match res {
|
|
|
|
|
Ok(html) => Html(html),
|
2024-05-19 12:22:56 +02:00
|
|
|
_ => Html("500 internal server error".to_string())
|
2024-05-18 20:45:35 +02:00
|
|
|
}
|
2024-05-20 21:07:37 +02:00
|
|
|
}
|
|
|
|
|
|
2024-05-30 21:03:25 +02:00
|
|
|
pub async fn api(State(client): State<Client>, request: axum::extract::Request) -> axum::response::Response {
|
2024-05-20 21:07:37 +02:00
|
|
|
let pathname = &request.uri();
|
|
|
|
|
let headers = &request.headers();
|
|
|
|
|
|
|
|
|
|
let req = tuono_lib::Request::new(pathname, headers);
|
|
|
|
|
|
2024-05-30 21:03:25 +02:00
|
|
|
let local_response = #fn_name(req.clone(), client).await;
|
2024-05-20 21:07:37 +02:00
|
|
|
|
|
|
|
|
let res = match local_response{
|
|
|
|
|
tuono_lib::Response::Props(val) => return axum::Json(val).into_response(),
|
|
|
|
|
_ => return axum::Json("").into_response()
|
|
|
|
|
};
|
2024-05-18 20:45:35 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.into()
|
|
|
|
|
}
|