rabbitmq_management_client/
lib.rs

1use crate::{
2    config::RabbitMqConfiguration, errors::RabbitMqClientError,
3    middlewares::authentication::AuthenticationMiddleware,
4};
5use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
6
7pub mod api;
8pub mod config;
9pub mod errors;
10mod middlewares;
11
12#[derive(Clone)]
13pub struct RabbitMqClient {
14    pub api_url: String,
15    pub client: ClientWithMiddleware,
16}
17
18pub struct RabbitMqClientBuilder {
19    config: RabbitMqConfiguration,
20    preset_client: Option<ClientWithMiddleware>,
21}
22
23impl RabbitMqClientBuilder {
24    pub fn new(config: RabbitMqConfiguration) -> Self {
25        Self {
26            config,
27            preset_client: None,
28        }
29    }
30
31    pub fn preset_client(mut self, client: ClientWithMiddleware) -> Self {
32        self.preset_client = Some(client);
33        self
34    }
35
36    #[tracing::instrument(skip(self))]
37    pub fn build(self) -> Result<RabbitMqClient, RabbitMqClientError> {
38        let client_builder = match self.preset_client {
39            None => ClientBuilder::new(reqwest::Client::new()),
40            Some(c) => ClientBuilder::from_client(c),
41        };
42
43        if self.config.rabbitmq_username.is_empty() || self.config.rabbitmq_password.is_empty() {
44            return Err(RabbitMqClientError::MissingCredentials);
45        }
46
47        let client = client_builder
48            .with(AuthenticationMiddleware {
49                username: self.config.rabbitmq_username,
50                password: self.config.rabbitmq_password,
51            })
52            .build();
53
54        Ok(RabbitMqClient {
55            api_url: self.config.rabbitmq_api_url,
56            client,
57        })
58    }
59}