harmos_operations/streams/
publish.rs1#[cfg(feature = "runtime")]
17use harmos_sdk::operations::publication::PublicationAccess;
18
19pub use harmos_domain::model::operations::publication::FollowingRow;
20
21harmos_domain::builtin_payload! {
26 #[harmos::operation(harmos_path = crate, id = "host.publish", policy = crate::host::POLICY,
27 codec = manual, visibility = Shared, resources = [PublicationAccess])]
28 Publish,
29 stream: String => (1, Kind::String, Required),
30 schema: u32 => (2, Kind::U32, Required),
31 sequence: Option<u64> => (3, Kind::U64, Optional),
32 published_unix_micros: Option<i64> => (4, Kind::I64, Optional),
33 context: Option<String> => (5, Kind::String, Optional),
34 payload: Vec<u8> => (6, Kind::Bytes, Required),
35 following: Vec<FollowingRow> => (7, Kind::Message { definition: FollowingRow::DEFINITION }, Repeated),
36}
37
38#[cfg(feature = "runtime")]
49impl crate::Operation for Publish {
50 type Error = crate::Error;
51
52 async fn run(mut self, context: harmos_sdk::Context<'_, Self>) -> Result<crate::Response<()>, Self::Error> {
53 let access = context.resource::<harmos_sdk::operations::publication::PublicationAccess>();
54
55 let publication = harmos_sdk::operations::publication::Publication {
56 stream: &self.stream,
57 schema: self.schema,
58 sequence: self.sequence,
59 published_unix_micros: self.published_unix_micros,
60 context: &mut self.context,
61 payload: &mut self.payload,
62 following: &mut self.following,
63 };
64 access.0.publish(context.call().clone(), publication).await.map_err(crate::Error::Access)?;
65 Ok(().into())
66 }
67}
68
69