use std::time::Duration;
use serde::{Deserialize, Serialize};
use crate::{bson::oid::ObjectId, bson_util, options::ServerAddress};
fn empty_address() -> ServerAddress {
ServerAddress::Tcp {
host: Default::default(),
port: None,
}
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[non_exhaustive]
pub struct PoolCreatedEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
pub options: Option<ConnectionPoolOptions>,
}
#[derive(Clone, Default, Deserialize, Debug, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ConnectionPoolOptions {
#[serde(rename = "maxIdleTimeMS")]
#[serde(default)]
#[serde(deserialize_with = "bson_util::deserialize_duration_option_from_u64_millis")]
pub max_idle_time: Option<Duration>,
pub max_pool_size: Option<u32>,
pub min_pool_size: Option<u32>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[non_exhaustive]
pub struct PoolReadyEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[non_exhaustive]
pub struct PoolClearedEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
pub service_id: Option<ObjectId>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[non_exhaustive]
pub struct PoolClosedEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ConnectionCreatedEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
#[serde(default = "default_connection_id")]
pub connection_id: u32,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ConnectionReadyEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
#[serde(default = "default_connection_id")]
pub connection_id: u32,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ConnectionClosedEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
#[serde(default)]
pub connection_id: u32,
pub reason: ConnectionClosedReason,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum ConnectionClosedReason {
Stale,
Idle,
Error,
Dropped,
PoolClosed,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[non_exhaustive]
pub struct ConnectionCheckoutStartedEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[non_exhaustive]
pub struct ConnectionCheckoutFailedEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
pub reason: ConnectionCheckoutFailedReason,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum ConnectionCheckoutFailedReason {
Timeout,
ConnectionError,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ConnectionCheckedOutEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
#[serde(default = "default_connection_id")]
pub connection_id: u32,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ConnectionCheckedInEvent {
#[serde(default = "self::empty_address")]
#[serde(skip_deserializing)]
pub address: ServerAddress,
#[serde(default = "default_connection_id")]
pub connection_id: u32,
}
fn default_connection_id() -> u32 {
42
}
pub trait CmapEventHandler: Send + Sync {
fn handle_pool_created_event(&self, _event: PoolCreatedEvent) {}
fn handle_pool_ready_event(&self, _event: PoolReadyEvent) {}
fn handle_pool_cleared_event(&self, _event: PoolClearedEvent) {}
fn handle_pool_closed_event(&self, _event: PoolClosedEvent) {}
fn handle_connection_created_event(&self, _event: ConnectionCreatedEvent) {}
fn handle_connection_ready_event(&self, _event: ConnectionReadyEvent) {}
fn handle_connection_closed_event(&self, _event: ConnectionClosedEvent) {}
fn handle_connection_checkout_started_event(&self, _event: ConnectionCheckoutStartedEvent) {}
fn handle_connection_checkout_failed_event(&self, _event: ConnectionCheckoutFailedEvent) {}
fn handle_connection_checked_out_event(&self, _event: ConnectionCheckedOutEvent) {}
fn handle_connection_checked_in_event(&self, _event: ConnectionCheckedInEvent) {}
}