pub mod fast;
pub mod webui;
use crate::{ResponseWriter, Result};
use std::collections::HashSet;
use webui_protocol::WebUIProtocol;
pub trait HandlerPlugin {
fn push_scope(&mut self);
fn pop_scope(&mut self);
fn on_binding_start(&mut self, name: &str, writer: &mut dyn ResponseWriter) -> Result<()>;
fn on_binding_end(&mut self, name: &str, writer: &mut dyn ResponseWriter) -> Result<()>;
fn on_for_start(&mut self, name: &str, writer: &mut dyn ResponseWriter) -> Result<()> {
self.on_binding_start(name, writer)
}
fn on_for_end(&mut self, name: &str, writer: &mut dyn ResponseWriter) -> Result<()> {
self.on_binding_end(name, writer)
}
fn on_if_start(&mut self, name: &str, writer: &mut dyn ResponseWriter) -> Result<()> {
self.on_binding_start(name, writer)
}
fn on_if_end(&mut self, name: &str, writer: &mut dyn ResponseWriter) -> Result<()> {
self.on_binding_end(name, writer)
}
fn on_repeat_item_start(&mut self, index: usize, writer: &mut dyn ResponseWriter)
-> Result<()>;
fn on_repeat_item_end(&mut self, index: usize, writer: &mut dyn ResponseWriter) -> Result<()>;
fn on_element_data(&mut self, data: &[u8], writer: &mut dyn ResponseWriter) -> Result<()>;
fn write_route_component_state(
&self,
_state: &serde_json::Value,
_writer: &mut dyn ResponseWriter,
) -> Result<()> {
Ok(())
}
}
pub(crate) fn emit_rendered_component_templates(
protocol: &WebUIProtocol,
rendered_components: &HashSet<String>,
nonce: Option<&str>,
writer: &mut dyn ResponseWriter,
) -> Result<()> {
for name in rendered_components {
if let Some(template) = protocol
.components
.get(name)
.map(|component| component.template.as_str())
.filter(|template| !template.is_empty())
{
emit_template_script(template, nonce, writer)?;
}
}
Ok(())
}
fn emit_template_script(
template: &str,
nonce: Option<&str>,
writer: &mut dyn ResponseWriter,
) -> Result<()> {
if let Some(nonce) = nonce {
if let Some(rest) = template.strip_prefix("<script>") {
writer.write("<script nonce=\"")?;
writer.write(nonce)?;
writer.write("\">")?;
writer.write(rest)?;
} else {
writer.write(template)?;
}
} else {
writer.write(template)?;
}
Ok(())
}