1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
use super::PubNub;
use crate::data::channel;
use crate::data::object::Object;
use crate::data::request;
use crate::data::timetoken::Timetoken;
use crate::runtime::Runtime;
use crate::transport::Transport;

impl<TTransport, TRuntime> PubNub<TTransport, TRuntime>
where
    TTransport: Transport + 'static,
    TRuntime: Runtime + 'static,
{
    /// Publish a message over the PubNub network.
    ///
    /// # Errors
    ///
    /// Returns transport-specific errors.
    ///
    /// # Example
    ///
    /// ```
    /// # use pubnub_core::mock::{transport::MockTransport, runtime::MockRuntime};
    /// # let transport = MockTransport::new();
    /// # let runtime = MockRuntime::new();
    /// use pubnub_core::{data::channel, json::object, Builder};
    ///
    /// # async {
    /// let pubnub = Builder::with_components(transport, runtime).build();
    ///
    /// let channel_name: channel::Name = "my-channel".parse().unwrap();
    /// let timetoken = pubnub
    ///     .publish(
    ///         channel_name,
    ///         object! {
    ///             "username" => "JoeBob",
    ///             "content" => "Hello, world!",
    ///         },
    ///     )
    ///     .await?;
    ///
    /// println!("Timetoken: {}", timetoken);
    /// # Ok::<(), Box<dyn std::error::Error>>(())
    /// # };
    /// ```
    pub async fn publish(
        &self,
        channel: channel::Name,
        message: Object,
    ) -> Result<Timetoken, <TTransport as Transport>::Error> {
        let request = request::Publish {
            channel,
            meta: None,
            payload: message,
        };
        self.transport.call(request).await
    }

    /// Publish a message over the PubNub network with an extra metadata payload.
    ///
    /// # Errors
    ///
    /// Returns transport-specific errors.
    ///
    /// # Example
    ///
    /// ```
    /// # use pubnub_core::mock::{transport::MockTransport, runtime::MockRuntime};
    /// # let transport = MockTransport::new();
    /// # let runtime = MockRuntime::new();
    /// use pubnub_core::{data::channel, json::object, Builder};
    ///
    /// # async {
    /// let pubnub = Builder::with_components(transport, runtime).build();
    ///
    /// let message = object! {
    ///     "username" => "JoeBob",
    ///     "content" => "Hello, world!",
    /// };
    /// let metadata = object! {
    ///     "uuid" => "JoeBob",
    /// };
    ///
    /// let channel_name: channel::Name = "my-channel".parse().unwrap();
    /// let timetoken = pubnub
    ///     .publish_with_metadata(channel_name, message, metadata)
    ///     .await?;
    ///
    /// println!("Timetoken: {}", timetoken);
    /// # Ok::<(), Box<dyn std::error::Error>>(())
    /// # };
    /// ```
    pub async fn publish_with_metadata(
        &self,
        channel: channel::Name,
        message: Object,
        metadata: Object,
    ) -> Result<Timetoken, <TTransport as Transport>::Error> {
        let request = request::Publish {
            channel,
            meta: Some(metadata),
            payload: message,
        };
        self.transport.call(request).await
    }
}