Files
tuono/crates/tuono_lib_macros/src/handler.rs
T

68 lines
2.2 KiB
Rust
Raw Normal View History

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-06-02 20:32:53 +02:00
use std::collections::HashMap;
use axum::extract::{State, Path};
2024-05-30 21:03:25 +02:00
use reqwest::Client;
2024-05-18 20:45:35 +02:00
#item
2024-06-02 20:32:53 +02:00
pub async fn route(
Path(params): Path<HashMap<String, String>>,
State(client): State<Client>,
request: axum::extract::Request
) -> Html<String> {
let pathname = &request.uri();
let headers = &request.headers();
2024-06-02 20:32:53 +02:00
let req = tuono_lib::Request::new(pathname, headers, params);
2024-05-30 21:03:25 +02:00
let local_response = #fn_name(req.clone(), client).await;
2024-05-30 21:03:25 +02:00
let res = match local_response {
tuono_lib::Response::Props(val) => {
// TODO: remove unwrap
let payload = tuono_lib::Payload::new(&req, val).client_payload().unwrap();
2024-05-18 20:45:35 +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),
_ => Html("500 internal server error".to_string())
2024-05-18 20:45:35 +02:00
}
2024-05-20 21:07:37 +02:00
}
2024-06-02 20:32:53 +02:00
pub async fn api(
Path(params): Path<HashMap<String, String>>,
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();
2024-06-02 20:32:53 +02:00
let req = tuono_lib::Request::new(pathname, headers, params);
2024-05-20 21:07:37 +02:00
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()
}