general_mq/connection.rs
1//! Traits and enumerations for connections.
2
3use std::{error::Error as StdError, sync::Arc};
4
5use async_trait::async_trait;
6
7/// Connection status.
8#[derive(Debug, PartialEq)]
9pub enum Status {
10 /// The connection is closing.
11 Closing,
12 /// The connection is closed by the program.
13 Closed,
14 /// Connecting to the message broker.
15 Connecting,
16 /// Connected to the message broker.
17 Connected,
18 /// The connection is not connected. It will retry connecting to the broker automatically.
19 Disconnected,
20}
21
22/// The operations for connections.
23#[async_trait]
24pub trait GmqConnection: Send + Sync {
25 /// To get the connection status.
26 fn status(&self) -> Status;
27
28 /// To add a connection event handler. This will return an identifier for applications to manage
29 /// handlers.
30 fn add_handler(&mut self, handler: Arc<dyn EventHandler>) -> String;
31
32 /// To remove a handler with an idenfier from [`GmqConnection::add_handler`].
33 fn remove_handler(&mut self, id: &str);
34
35 /// To connect to the message broker. The [`GmqConnection`] will connect to the broker using
36 /// another runtime task and report status with [`Status`]s.
37 fn connect(&mut self) -> Result<(), Box<dyn StdError>>;
38
39 /// To close the connection.
40 async fn close(&mut self) -> Result<(), Box<dyn StdError + Send + Sync>>;
41}
42
43/// The event handler for connections.
44#[async_trait]
45pub trait EventHandler: Send + Sync {
46 /// Triggered when there are errors.
47 async fn on_error(
48 &self,
49 handler_id: String,
50 conn: Arc<dyn GmqConnection>,
51 err: Box<dyn StdError + Send + Sync>,
52 );
53
54 /// Triggered by [`Status`].
55 async fn on_status(&self, handler_id: String, conn: Arc<dyn GmqConnection>, status: Status);
56}
57
58impl Copy for Status {}
59
60impl Clone for Status {
61 fn clone(&self) -> Status {
62 *self
63 }
64}