Skip to main content

harmos_operations/streams/
publish.rs

1/* ***
2 *
3 * Harmos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * ***
8 */
9
10/* === Modules === */
11
12/* === Re-Exports === */
13
14pub use harmos_domain::model::operations::publication::FollowingRow;
15
16/* === Imports === */
17
18// Standard Library Imports
19
20// Third Party Imports
21
22// Local Imports
23#[cfg(feature = "runtime")]
24use harmos_sdk::operations::publication::PublicationAccess;
25
26/* === Constants === */
27
28/* === Macros === */
29
30harmos_domain::builtin_payload! {
31    #[harmos::operation(harmos_path = crate, id = "host.publish", policy = crate::host::POLICY,
32        codec = manual, visibility = Shared, resources = [PublicationAccess])]
33    Publish,
34    stream: String => (1, Kind::String, Required),
35    schema: u32 => (2, Kind::U32, Required),
36    sequence: Option<u64> => (3, Kind::U64, Optional),
37    published_unix_micros: Option<i64> => (4, Kind::I64, Optional),
38    context: Option<String> => (5, Kind::String, Optional),
39    payload: Vec<u8> => (6, Kind::Bytes, Required),
40    following: Vec<FollowingRow> => (7, Kind::Message { definition: FollowingRow::DEFINITION }, Repeated),
41}
42
43/* === Type Aliases === */
44
45/* === Structs === */
46
47/* === Enums === */
48
49/* === Traits === */
50
51/* === Implementations === */
52
53#[cfg(feature = "runtime")]
54impl crate::Operation for Publish {
55    type Error = crate::Error;
56
57    async fn run(mut self, context: harmos_sdk::Context<'_, Self>) -> Result<crate::Response<()>, Self::Error> {
58        let access = context.resource::<harmos_sdk::operations::publication::PublicationAccess>();
59
60        let publication = harmos_sdk::operations::publication::Publication {
61            stream: &self.stream,
62            schema: self.schema,
63            sequence: self.sequence,
64            published_unix_micros: self.published_unix_micros,
65            context: &mut self.context,
66            payload: &mut self.payload,
67            following: &mut self.following,
68        };
69        access.0.publish(context.call().clone(), publication).await.map_err(crate::Error::Access)?;
70        Ok(().into())
71    }
72}
73
74/* === Public Functions === */
75
76/* === Private Functions === */
77
78/* === Tests === */