pub mod fast;
pub mod fast_v2;
pub mod fast_v3;
pub mod webui;
use crate::{ResponseWriter, Result};
use std::collections::HashSet;
use webui_protocol::WebUIProtocol;
pub struct WebUiTemplatePayload<'a> {
pub tag_name: &'a str,
pub template_json: &'a str,
pub template_functions: &'a str,
}
pub struct BootstrapExtensionContext<'a> {
pub protocol: &'a WebUIProtocol,
pub components: &'a HashSet<String>,
pub payloads: &'a [WebUiTemplatePayload<'a>],
pub nonce: Option<&'a str>,
}
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(())
}
fn emit_templates(
&self,
protocol: &WebUIProtocol,
components: &HashSet<String>,
_nonce: Option<&str>,
writer: &mut dyn ResponseWriter,
) -> Result<()> {
emit_component_templates(protocol, components, writer)
}
fn collect_template_payloads<'a>(
&self,
_protocol: &'a WebUIProtocol,
_components: &HashSet<String>,
) -> Option<Vec<WebUiTemplatePayload<'a>>> {
None
}
fn emit_bootstrap_extension(
&self,
_context: BootstrapExtensionContext<'_>,
_writer: &mut dyn ResponseWriter,
) -> Result<()> {
Ok(())
}
}
pub(crate) fn emit_component_templates(
protocol: &WebUIProtocol,
components: &HashSet<String>,
writer: &mut dyn ResponseWriter,
) -> Result<()> {
for name in components {
if let Some(template) = protocol
.components
.get(name)
.map(|component| component.template.as_str())
.filter(|template| !template.is_empty())
{
writer.write(template)?;
}
}
Ok(())
}