use crate::{ComponentRender, Context, Event, Html, LiveResult};
pub trait LiveView: Send + 'static {
fn mount(&mut self, _ctx: &mut Context) -> LiveResult {
Ok(())
}
fn handle_params(&mut self, _ctx: &mut Context) -> LiveResult {
Ok(())
}
fn handle_event(&mut self, _event: Event, _ctx: &mut Context) -> LiveResult {
Ok(())
}
fn handle_component_event(
&mut self,
_target: &str,
_event: Event,
_ctx: &mut Context,
) -> LiveResult<Option<ComponentRender>> {
Ok(None)
}
fn render(&self) -> Html;
}
#[cfg(test)]
mod tests {
use super::LiveView;
use crate::{Context, Event, Html};
#[derive(Default)]
struct StubView;
impl LiveView for StubView {
fn render(&self) -> Html {
Html::new("<main>stub</main>")
}
}
#[test]
fn live_view_default_callbacks_return_ok() {
let mut view = StubView;
let mut ctx = Context::new("root");
assert!(view.mount(&mut ctx).is_ok());
assert!(view.handle_params(&mut ctx).is_ok());
assert!(view.handle_event(Event::new("noop"), &mut ctx).is_ok());
assert!(view
.handle_component_event("child-1", Event::new("noop"), &mut ctx)
.expect("component callback should succeed")
.is_none());
assert_eq!(view.render().as_str(), "<main>stub</main>");
}
}