momento_functions_host/
topics.rs1use momento_functions_wit::host::momento::functions::topic;
4use serde::Serialize;
5
6use crate::encoding::{Encode, EncodeError, Json};
7
8#[derive(Debug, thiserror::Error)]
10pub enum PublishError<E: EncodeError> {
11 #[error("Failed to encode message")]
13 EncodeFailed {
14 cause: E,
16 },
17 #[error(transparent)]
19 PublishError(#[from] topic::Error),
20}
21
22pub fn publish<T: PublishKind>(
65 topic: impl AsRef<str>,
66 value: T,
67) -> Result<(), PublishError<<<T as PublishKind>::Encoding as Encode>::Error>> {
68 match value
69 .as_publish()
70 .map_err(|e| PublishError::EncodeFailed { cause: e })?
71 {
72 Publish::Str(s) => topic::publish(topic.as_ref(), s),
73 Publish::String(s) => topic::publish(topic.as_ref(), s.as_str()),
74 Publish::Bytes(b) => topic::publish_bytes(
75 topic.as_ref(),
76 &b.try_serialize()
77 .map_err(|e| PublishError::EncodeFailed { cause: e })?
78 .into(),
79 ),
80 }
81 .map_err(Into::into)
82}
83
84pub trait PublishKind {
86 type Encoding: Encode;
88
89 fn as_publish(&self) -> Result<Publish<'_, Self::Encoding>, <Self::Encoding as Encode>::Error>;
91}
92impl PublishKind for String {
93 type Encoding = String;
94
95 fn as_publish(&self) -> Result<Publish<'_, Self::Encoding>, <Self::Encoding as Encode>::Error> {
96 Ok(Publish::Str(self))
97 }
98}
99impl<'a> PublishKind for &'a str {
100 type Encoding = &'a str;
101
102 fn as_publish(&self) -> Result<Publish<'a, Self::Encoding>, <Self::Encoding as Encode>::Error> {
103 Ok(Publish::Str(self))
104 }
105}
106impl<'a> PublishKind for &'a [u8] {
107 type Encoding = &'a [u8];
108
109 fn as_publish(&self) -> Result<Publish<'a, Self::Encoding>, <Self::Encoding as Encode>::Error> {
110 Ok(Publish::Bytes(self))
111 }
112}
113impl PublishKind for Vec<u8> {
114 type Encoding = Vec<u8>;
115
116 fn as_publish(&self) -> Result<Publish<'_, Self::Encoding>, <Self::Encoding as Encode>::Error> {
117 Ok(Publish::Bytes(self.clone()))
118 }
119}
120impl<T: Serialize> PublishKind for Json<T> {
121 type Encoding = Json<T>;
122
123 fn as_publish(&self) -> Result<Publish<'_, Self::Encoding>, <Self::Encoding as Encode>::Error> {
124 serde_json::to_string(&self.0).map(Publish::String)
125 }
126}
127
128pub enum Publish<'a, P: Encode = &'a [u8]> {
131 Str(&'a str),
133 String(String),
135 Bytes(P),
137}