rumtk_web/utils/
render.rs1use crate::types::HTMLResult;
24use crate::{RUMWebRedirect, RUMWebTemplate};
25use askama::Template;
26use rumtk_core::strings::{rumtk_format, RUMString};
27
28#[derive(RUMWebTemplate)]
29#[template(
30 source = "
31 {% for element in elements %}
32 {{ element|safe }}
33 {% endfor %}
34 ",
35 ext = "html"
36)]
37struct ContentBlock<'a> {
38 elements: &'a [RUMString],
39}
40
41pub fn rumtk_web_render_html<T: askama::Template>(template: T, url: RUMWebRedirect) -> HTMLResult {
42 let result = template.render();
43 match result {
44 Ok(html) => Ok(url.into_web_response(Some(html))),
45 Err(e) => {
46 let tn = std::any::type_name::<T>();
47 Err(rumtk_format!("Template {tn} render failed: {e:?}"))
48 }
49 }
50}
51
52pub fn rumtk_web_render_contents(elements: &[RUMString]) -> HTMLResult {
53 rumtk_web_render_html(ContentBlock { elements }, RUMWebRedirect::None)
54}
55
56pub fn rumtk_web_redirect(url: RUMWebRedirect) -> HTMLResult {
57 Ok(url.into_web_response(Some(String::default())))
58}
59
60#[macro_export]
61macro_rules! rumtk_web_render_component {
62 ( $component_fxn:expr ) => {{
63 use rumtk_core::strings::{RUMString, RUMStringConversions};
64 match $component_fxn() {
65 Ok(x) => x.to_rumstring(),
66 _ => RUMString::default(),
67 }
68 }};
69 ( $component_fxn:expr, $app_state:expr ) => {{
70 use rumtk_core::strings::{RUMString, RUMStringConversions};
71 match $component_fxn($app_state.clone()) {
72 Ok(x) => x.to_rumstring(),
73 _ => RUMString::default(),
74 }
75 }};
76 ( $component:expr, $params:expr, $app_state:expr ) => {{
77 rumtk_web_render_component!($component, &[""], $params, $app_state)
78 }};
79 ( $component:expr, $path:expr, $params:expr, $app_state:expr ) => {{
80 use rumtk_core::strings::{RUMString, RUMStringConversions};
81 use $crate::{rumtk_web_get_component, rumtk_web_params_map};
82
83 let component = rumtk_web_get_component!($component);
84
85 match component($path, &rumtk_web_params_map!($params), $app_state.clone()) {
86 Ok(x) => x.to_rumstring(),
87 _ => RUMString::default(),
88 }
89 }};
90}
91
92#[macro_export]
93macro_rules! rumtk_web_render_html {
94 ( $page:expr ) => {{
95 use $crate::utils::{rumtk_web_render_html, RUMWebRedirect};
96
97 rumtk_web_render_html($page, RUMWebRedirect::None)
98 }};
99 ( $page:expr, $redirect_url:expr ) => {{
100 use $crate::utils::rumtk_web_render_html;
101
102 rumtk_web_render_html($page, $redirect_url)
103 }};
104}
105
106#[macro_export]
107macro_rules! rumtk_web_render_page_contents {
108 ( $page_elements:expr ) => {{
109 use $crate::utils::rumtk_web_render_contents;
110
111 rumtk_web_render_contents($page_elements)
112 }};
113}
114
115#[macro_export]
116macro_rules! rumtk_web_render_redirect {
117 ( $url:expr ) => {{
118 use $crate::utils::rumtk_web_redirect;
119
120 rumtk_web_redirect($url)
121 }};
122}
123
124#[macro_export]
129macro_rules! rumtk_web_render_markdown {
130 ( $md:expr ) => {{
131 use pulldown_cmark::{Options, Parser};
132 use rumtk_core::strings::RUMStringConversions;
133
134 let mut options = Options::empty();
135 options.insert(Options::ENABLE_STRIKETHROUGH);
136 options.insert(Options::ENABLE_TASKLISTS);
137 options.insert(Options::ENABLE_MATH);
138 options.insert(Options::ENABLE_TABLES);
139 options.insert(Options::ENABLE_WIKILINKS);
140
141 let input = String::from($md);
142 let parser = Parser::new_ext(&input, options);
143 let mut html_output = String::new();
144 pulldown_cmark::html::push_html(&mut html_output, parser);
145
146 html_output.to_rumstring()
147 }};
148}