use maud::Markup;
use crate::components::{SharedChromeFolder, SlotCtx};
use crate::layers::BuildFromData;
use crate::template::{RenderAppPane, RenderTemplate};
use crate::web::Htmx;
pub fn render_from_data<P, Data>(
htmx: &Htmx,
data: &Data,
chrome: &SharedChromeFolder,
slot_ctx: &SlotCtx,
) -> Markup
where
P: BuildFromData<Data> + RenderTemplate + RenderAppPane,
{
let page = P::build_from_data(data);
html_built_page_or_app_layout(&page, htmx, chrome, slot_ctx)
}
pub fn html_built_page_or_app_layout<P>(
page: &P,
htmx: &Htmx,
chrome: &SharedChromeFolder,
slot_ctx: &SlotCtx,
) -> Markup
where
P: RenderTemplate + RenderAppPane,
{
if htmx.wants_main_content() {
return page.render_main().into();
}
if htmx.wants_app_layout() {
return page.render_pane().into();
}
let shell = chrome.fold(slot_ctx);
page.render(&shell)
}
pub fn html_built_page_with_slots<P>(
page: &P,
chrome: &SharedChromeFolder,
slot_ctx: &SlotCtx,
) -> Markup
where
P: RenderTemplate,
{
let shell = chrome.fold(slot_ctx);
page.render(&shell)
}