HxBoostedBy macro to avoid redundant if-else for layout
qrdwtf opened this issue · comments
Hi!
I'd like to propose a macros feature in addition to HxBoosted
extractor.
Currently with axum-htmx we use HxBoosted
like this:
async fn get_index(HxBoosted(boosted): HxBoosted) -> impl IntoResponse {
if boosted {
// Send a template extending from _partial.html
} else {
// Send a template extending from _base.html
}
}
I propose to add a macro, then it will be:
#[hx_boosted_by(with_layout)]
async fn get_index() -> Html<String> {
// some impl here
// <-- page html -->
}
fn with_layout(Html(html): Html<String>) -> Html<String> {
// Wrap page html into layout if called
}
What this macro does is transforming that function to:
async fn get_index(HxBoosted(boosted): HxBoosted) -> Html<String> {
// some impl here
if boosted {
// <-- page html -->
} else {
// <-- with_layout(page html) -->
}
}
I don't have much experience with Rust but managed to write something close to that macro in this axum-htmx-derive repo. Didn't publish yet, don't think it requires separate package - but needs to be included in axum-htmx (with feature flag).
Currently it has 2 macros: hx_boosted_by
and hx_boosted_by_async
- if you have any idea on how it can be merged I'm here :)
Let me know what you think.
I'm okay with this. I think reducing the boilerplate is worth the additional complexity and I'm willing to maintain it long-term. It fits within the spirit of the library.
Are you interested in starting a draft PR for this here? I imagine that most of your downstream work should be generally transferrable, though I haven't had a chance to look through your repo yet.
That's great! Sure, I'll make a PR.