relm4/component/async/
controller.rs1use std::fmt::{self, Debug};
6
7use crate::{Sender, ShutdownOnDrop};
8
9use super::AsyncComponent;
10
11pub trait AsyncComponentController<C: AsyncComponent> {
13 fn emit(&self, event: C::Input) {
15 self.sender().send(event).unwrap();
16 }
17
18 fn sender(&self) -> &Sender<C::Input>;
20
21 fn widget(&self) -> &C::Root;
23
24 fn detach_runtime(&mut self);
29}
30
31pub struct AsyncController<C: AsyncComponent> {
33 pub(super) widget: C::Root,
35
36 pub(super) sender: Sender<C::Input>,
38
39 pub(super) shutdown_on_drop: ShutdownOnDrop,
41}
42
43impl<C: AsyncComponent> AsyncComponentController<C> for AsyncController<C> {
44 fn sender(&self) -> &Sender<C::Input> {
45 &self.sender
46 }
47
48 fn widget(&self) -> &C::Root {
49 &self.widget
50 }
51
52 fn detach_runtime(&mut self) {
53 self.shutdown_on_drop.deactivate();
54 }
55}
56
57impl<C> Debug for AsyncController<C>
58where
59 C: AsyncComponent + Debug,
60 C::Widgets: Debug,
61{
62 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
63 f.debug_struct("Controller")
64 .field("widget", &self.widget)
65 .field("sender", &self.sender)
66 .finish()
67 }
68}