tilo_app/framework/
delivery.rs1use ui_core::automerge::{AutoCommit, ObjId};
8use ui_core::host_operation::{ResourceOperation, ResourceOperationStart};
9use ui_core::widget::Widget;
10
11use super::Effected;
12
13const CONTROL_INVOKE: &str = "tilo.ui.control.invoke";
15
16pub trait HostDelivery {
20 fn start_encoded(
26 &mut self,
27 kind: tilo_actions::OperationKind,
28 type_id: &str,
29 payload: &[u8],
30 doc: &mut AutoCommit,
31 path: &ObjId,
32 ) -> Result<Option<Effected>, String>;
33
34 fn deliver_control(
41 &mut self,
42 kind: tilo_actions::OperationKind,
43 control: &str,
44 doc: &mut AutoCommit,
45 path: &ObjId,
46 ) -> Result<Option<Effected>, String> {
47 let payload = serde_json::to_vec(control).map_err(|error| error.to_string())?;
48 self.start_encoded(kind, CONTROL_INVOKE, &payload, doc, path)
49 }
50}
51
52impl<W: Widget + ?Sized> HostDelivery for W {
53 fn start_encoded(
54 &mut self,
55 kind: tilo_actions::OperationKind,
56 type_id: &str,
57 payload: &[u8],
58 doc: &mut AutoCommit,
59 path: &ObjId,
60 ) -> Result<Option<Effected>, String> {
61 let started = self.start_operation(
62 &ResourceOperation::local(tilo_actions::InvocationId::new(), kind, type_id, payload),
63 &mut ui_core::widget::Edits::lend(doc),
64 path,
65 )?;
66 Ok(started.map(|started| match started {
67 ResourceOperationStart::Completed(output) => Effected::Done(output),
68 ResourceOperationStart::Accepted => Effected::Pending,
69 }))
70 }
71}