momento_functions_host/
topics.rs1use momento_functions_wit::host::momento::functions::topic;
4use serde::Serialize;
5
6use crate::{
7 FunctionResult,
8 encoding::{Encode, Json},
9};
10
11pub fn publish<T: for<'a> PublishKind<'a>>(topic: impl AsRef<str>, value: T) -> FunctionResult<()> {
51 match value.as_publish()? {
52 Publish::Str(s) => topic::publish(topic.as_ref(), s),
53 Publish::String(s) => topic::publish(topic.as_ref(), s.as_str()),
54 Publish::Bytes(b) => topic::publish_bytes(topic.as_ref(), &b.try_serialize()?.into()),
55 }
56 .map_err(Into::into)
57}
58
59pub trait PublishKind<'a> {
61 type Encoding: Encode;
63
64 fn as_publish(&'a self) -> FunctionResult<Publish<'a, Self::Encoding>>;
66}
67impl<'a> PublishKind<'a> for String {
68 type Encoding = &'a [u8];
69
70 fn as_publish(&'a self) -> FunctionResult<Publish<'a, Self::Encoding>> {
71 Ok(Publish::Str(self))
72 }
73}
74impl<'a> PublishKind<'a> for &str {
75 type Encoding = &'a [u8];
76
77 fn as_publish(&'a self) -> FunctionResult<Publish<'a, Self::Encoding>> {
78 Ok(Publish::Str(self))
79 }
80}
81impl<'a> PublishKind<'a> for &[u8] {
82 type Encoding = &'a [u8];
83
84 fn as_publish(&'a self) -> FunctionResult<Publish<'a, Self::Encoding>> {
85 Ok(Publish::Bytes(self))
86 }
87}
88impl<'a> PublishKind<'a> for Vec<u8> {
89 type Encoding = &'a [u8];
90
91 fn as_publish(&'a self) -> FunctionResult<Publish<'a, Self::Encoding>> {
92 Ok(Publish::Bytes(self.as_slice()))
93 }
94}
95impl<'a, T: Serialize> PublishKind<'a> for Json<T> {
96 type Encoding = &'a [u8];
97
98 fn as_publish(&'a self) -> FunctionResult<Publish<'a, Self::Encoding>> {
99 serde_json::to_string(&self.0)
100 .map_err(|e| crate::Error::MessageError(format!("failed to serialize json: {e}")))
101 .map(Publish::String)
102 }
103}
104
105pub enum Publish<'a, P: Encode = &'a [u8]> {
108 Str(&'a str),
110 String(String),
112 Bytes(P),
114}