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
#![doc = include_str!("../README.md")]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![deny(
nonstandard_style,
rust_2018_idioms,
rustdoc::broken_intra_doc_links,
rustdoc::private_intra_doc_links
)]
#![forbid(non_ascii_idents, unsafe_code)]
#![warn(
deprecated_in_future,
missing_copy_implementations,
missing_debug_implementations,
missing_docs,
unreachable_pub,
unused_import_braces,
unused_labels,
unused_lifetimes,
unused_qualifications,
unused_results
)]
mod config;
use deadpool::{async_trait, managed};
use lapin::{ConnectionProperties, Error};
pub use lapin;
pub use self::config::{Config, ConfigError};
pub use deadpool::managed::reexports::*;
deadpool::managed_reexports!(
"lapin",
Manager,
deadpool::managed::Object<Manager>,
Error,
ConfigError
);
pub type Connection = managed::Object<Manager>;
type RecycleResult = managed::RecycleResult<Error>;
type RecycleError = managed::RecycleError<Error>;
#[derive(Debug)]
pub struct Manager {
addr: String,
connection_properties: ConnectionProperties,
}
impl Manager {
#[must_use]
pub fn new<S: Into<String>>(addr: S, connection_properties: ConnectionProperties) -> Self {
Self {
addr: addr.into(),
connection_properties,
}
}
}
#[async_trait]
impl managed::Manager for Manager {
type Type = lapin::Connection;
type Error = Error;
async fn create(&self) -> Result<lapin::Connection, Error> {
let conn =
lapin::Connection::connect(self.addr.as_str(), self.connection_properties.clone())
.await?;
Ok(conn)
}
async fn recycle(&self, conn: &mut lapin::Connection) -> RecycleResult {
match conn.status().state() {
lapin::ConnectionState::Connected => Ok(()),
other_state => Err(RecycleError::Message(format!(
"lapin connection is in state: {:?}",
other_state
))),
}
}
}