sylvia_iot_broker/models/mongodb/
conn.rs1use std::{error::Error as StdError, sync::Arc};
2
3use log::{error, info};
4use mongodb::{
5 event::{cmap::CmapEvent, EventHandler},
6 options::ClientOptions,
7 Client, Database,
8};
9
10pub struct Options {
12 pub url: String,
14 pub db: String,
16 pub pool_size: Option<u32>,
18}
19
20pub async fn connect(options: &Options) -> Result<Database, Box<dyn StdError>> {
22 let mut opts = ClientOptions::parse(&options.url).await?;
23 if let Some(pool_size) = options.pool_size {
24 opts.max_pool_size = Some(pool_size);
25 }
26 opts.cmap_event_handler = Some(EventHandler::Callback(Arc::new(event_handler)));
27 let client = Client::with_options(opts)?;
28 client.list_database_names().await?;
29 Ok(client.database(&options.db))
30}
31
32fn event_handler(ev: CmapEvent) {
33 match ev {
34 CmapEvent::PoolCreated(_ev) => {
35 info!("[CmapEvent::PoolCreated]");
36 }
37 CmapEvent::PoolReady(_ev) => {
38 info!("[CmapEvent::PoolReady]");
39 }
40 CmapEvent::PoolCleared(_ev) => {
41 error!("[CmapEvent::PoolCleared]");
42 }
43 CmapEvent::PoolClosed(_ev) => {
44 error!("[CmapEvent::PoolClosed]");
45 }
46 CmapEvent::ConnectionCreated(_ev) => {
47 info!("[CmapEvent::ConnectionCreated]");
48 }
49 CmapEvent::ConnectionReady(_ev) => {
50 info!("[CmapEvent::ConnectionReady]");
51 }
52 CmapEvent::ConnectionClosed(_ev) => {
53 error!("[CmapEvent::ConnectionClosed]");
54 }
55 CmapEvent::ConnectionCheckoutStarted(_ev) => {
56 info!("[CmapEvent::ConnectionCheckoutStarted]");
57 }
58 CmapEvent::ConnectionCheckoutFailed(_ev) => {
59 error!("[CmapEvent::ConnectionCheckoutFailed]");
60 }
61 CmapEvent::ConnectionCheckedOut(_ev) => {
62 info!("[CmapEvent::ConnectionCheckedOut]");
63 }
64 CmapEvent::ConnectionCheckedIn(_ev) => {
65 info!("[CmapEvent::ConnectionCheckedIn]");
66 }
67 _ => {
68 error!("[CmapEvent::Unknown]");
69 }
70 }
71}