rucent/
options.rs

1#![allow(dead_code)]
2
3use serde;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Clone, Debug, Default, Copy, Serialize, Deserialize)]
8pub struct PublishOptions {
9    pub skip_history: Option<bool>,
10}
11
12/// PublishOption is a type to represent vairous publish options
13pub type PublishOption = Box<dyn Fn(&mut PublishOptions)>;
14
15/// with_skip_history allows to set skip_history field.
16pub fn with_skip_history(skip: bool) -> PublishOption {
17    Box::new(move |opts: &mut PublishOptions| {
18        opts.skip_history = Some(skip);
19    })
20}
21
22/// SubscribeOption define the per-subscription options
23#[derive(Clone, Debug, Serialize, Default, Deserialize)]
24pub struct SubscribeOptions {
25    /// ChannelInfo defines custom channel information, zero value means no channel information.
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub info: Option<Value>,
28    /// Presence turns on participating in channel presence.
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub presence: Option<bool>,
31    /// JoinLeave enables sending Join and Leave messages for this client in channel.
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub join_leave: Option<bool>,
34    /// When position is on client will additionally sync its position inside
35    /// a stream to prevent message loss. Make sure you are enabling Position in channels
36    /// that maintain Publication history stream. When Position is on  Centrifuge will
37    /// include StreamPosition information to subscribe response - for a client to be able
38    /// to manually track its position inside a stream.
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub position: Option<bool>,
41    /// Recover turns on recovery option for a channel. In this case client will try to
42    /// recover missed messages automatically upon resubscribe to a channel after reconnect
43    /// to a server. This option also enables client position tracking inside a stream
44    /// (like Position option) to prevent occasional message loss. Make sure you are using
45    /// Recover in channels that maintain Publication history stream.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub recover: Option<bool>,
48    /// Data to send to a client with Subscribe Push.
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub data: Option<Value>,
51    /// RecoverSince will try to subscribe a client and recover from a certain StreamPosition.
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub recover_since: Option<StreamPosition>,
54    /// ClientID to subscribe.
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub client_id: Option<String>,
57}
58
59pub type SubscribeOption = Box<dyn Fn(&mut SubscribeOptions)>;
60
61pub fn with_subscribe_info(chan_info: Value) -> SubscribeOption {
62    Box::new(move |opts: &mut SubscribeOptions| opts.info = Some(chan_info.clone()))
63}
64
65pub fn with_presence(enabled: bool) -> SubscribeOption {
66    Box::new(move |opts: &mut SubscribeOptions| opts.presence = Some(enabled))
67}
68
69pub fn with_join_leave(enabled: bool) -> SubscribeOption {
70    Box::new(move |opts: &mut SubscribeOptions| opts.join_leave = Some(enabled))
71}
72
73pub fn with_position(enabled: bool) -> SubscribeOption {
74    Box::new(move |opts: &mut SubscribeOptions| opts.position = Some(enabled))
75}
76
77pub fn with_recover(enabled: bool) -> SubscribeOption {
78    Box::new(move |opts: &mut SubscribeOptions| opts.recover = Some(enabled))
79}
80
81pub fn with_subscribe_client(client_id: String) -> SubscribeOption {
82    Box::new(move |opts: &mut SubscribeOptions| opts.client_id = Some(client_id.clone()))
83}
84
85pub fn with_subscribe_data(data: Value) -> SubscribeOption {
86    Box::new(move |opts: &mut SubscribeOptions| opts.data = Some(data.clone()))
87}
88
89pub fn with_recover_since(since: StreamPosition) -> SubscribeOption {
90    Box::new(move |opts: &mut SubscribeOptions| opts.recover_since = Some(since.clone()))
91}
92
93#[derive(Serialize, Deserialize, Clone, Debug, Default)]
94pub struct UnsubscribeOptions {
95    /// client_id is unsubscribe.
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub client_id: Option<String>,
98}
99
100pub type UnsubscribeOption = Box<dyn Fn(&mut UnsubscribeOptions)>;
101
102pub fn with_unsubscribe_client(client_id: String) -> UnsubscribeOption {
103    Box::new(move |opts: &mut UnsubscribeOptions| opts.client_id = Some(client_id.clone()))
104}
105
106#[derive(Serialize, Deserialize, Clone, Debug, Default)]
107pub struct Disconnect {
108    #[serde(skip_serializing_if = "Option::is_none")]
109    pub code: Option<u32>,
110    pub reason: Option<String>,
111    pub reconnect: Option<bool>,
112}
113
114#[derive(Serialize, Deserialize, Clone, Debug, Default)]
115pub struct DisconnectOptions {
116    pub disconnect: Option<Disconnect>,
117    pub client_whitelist: Option<Vec<String>>,
118    #[serde(skip_serializing_if = "Option::is_none")]
119    pub client_id: Option<String>,
120}
121
122pub type DisconnectOption = Box<dyn Fn(&mut DisconnectOptions)>;
123
124pub fn with_disconnect(disconnect: Disconnect) -> DisconnectOption {
125    Box::new(move |opts: &mut DisconnectOptions| opts.disconnect = Some(disconnect.clone()))
126}
127
128pub fn with_disconnect_client(client_id: String) -> DisconnectOption {
129    Box::new(move |opts: &mut DisconnectOptions| opts.client_id = Some(client_id.clone()))
130}
131
132pub fn with_disconnect_client_whitelist(whitelist: Vec<String>) -> DisconnectOption {
133    Box::new(move |opts: &mut DisconnectOptions| opts.client_whitelist = Some(whitelist.clone()))
134}
135#[derive(Serialize, Deserialize, Clone, Debug, Default)]
136pub struct HistoryOptions {
137    #[serde(skip_serializing_if = "Option::is_none")]
138    pub since: Option<StreamPosition>,
139    #[serde(skip_serializing_if = "Option::is_none")]
140    pub limit: Option<i32>,
141    #[serde(skip_serializing_if = "Option::is_none")]
142    pub reverse: Option<bool>,
143}
144
145pub const NO_LIMIT: i32 = -1;
146
147pub type HistoryOption = Box<dyn Fn(&mut HistoryOptions)>;
148
149pub fn with_limit(limit: i32) -> HistoryOption {
150    Box::new(move |opts: &mut HistoryOptions| opts.limit = Some(limit))
151}
152
153#[derive(Serialize, Deserialize, Debug, Default, Clone)]
154pub struct StreamPosition {
155    #[serde(skip_serializing_if = "Option::is_none")]
156    pub offset: Option<u64>,
157    #[serde(skip_serializing_if = "Option::is_none")]
158    pub epoch: Option<String>,
159}
160
161pub fn with_since(since: StreamPosition) -> HistoryOption {
162    Box::new(move |opts: &mut HistoryOptions| opts.since = Some(since.clone()))
163}
164
165pub fn with_reverse(reverse: bool) -> HistoryOption {
166    Box::new(move |opts: &mut HistoryOptions| opts.reverse = Some(reverse))
167}
168#[derive(Serialize, Deserialize, Debug, Default)]
169pub struct ChannelsOptions {
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub pattern: Option<String>,
172}
173
174pub(crate) type ChannelsOption = Box<dyn Fn(&mut ChannelsOptions)>;
175
176pub fn with_pattern(pattern: String) -> ChannelsOption {
177    Box::new(move |opts: &mut ChannelsOptions| opts.pattern = Some(pattern.clone()))
178}