valensas-rocket 0.1.3

A library that provides a Rocket client with the capability of metric collection for endpoints.
Documentation
#![allow(non_snake_case)]

use std::{
    future::Future,
    net::{IpAddr, Ipv4Addr},
};

use rocket::{fairing::Fairing, Build, Error, Ignite, Rocket, Route};
use valensas_actuator::metrics::ArcRwLockPrometheus;

use super::client_params::ClientParams;

pub struct Client {
    params: ClientParams,
    pub rocket_server: Rocket<Build>,
}

impl Clone for Client {
    fn clone(&self) -> Self {
        let custom = rocket::Config {
            address: IpAddr::V4(self.params.ip_addr.parse::<Ipv4Addr>().unwrap()),
            port: self.params.port.parse::<u16>().unwrap(),
            ..Default::default()
        };
        Self {
            rocket_server: rocket::custom(custom),
            params: self.params.clone(),
        }
    }
}

impl Client {
    pub fn new(
        params: ClientParams,
        endpoints: Vec<Route>,
        prometheus: Option<ArcRwLockPrometheus>,
    ) -> Self {
        let mut custom = rocket::config::Config::release_default();
        let ip_address = params.ip_addr.parse::<Ipv4Addr>();
        let port = params.port.parse::<u16>();
        if let Ok(ip) = ip_address {
            custom.address = IpAddr::V4(ip);
        }
        if let Ok(prt) = port {
            custom.port = prt;
        }

        let rocket_server = match prometheus {
            Some(prometheus) => rocket::custom(custom)
                .attach(prometheus.clone())
                .manage(prometheus)
                .mount("/", endpoints),
            None => rocket::custom(custom).mount("/", endpoints),
        };

        Self {
            rocket_server,
            params,
        }
    }

    pub fn set_manage<T>(mut self, manage: T) -> Self
    where
        T: Send + Sync + 'static,
    {
        self.rocket_server = self.rocket_server.manage(manage);
        self
    }

    pub fn set_fairing<T>(mut self, attachment: T) -> Self
    where
        T: Fairing,
    {
        self.rocket_server = self.rocket_server.attach(attachment);
        self
    }

    pub async fn spawn_rocket(self) -> impl Future<Output = Result<Rocket<Ignite>, Error>> {
        let rocket = match self.rocket_server.ignite().await {
            Ok(res) => res,
            Err(err) => {
                panic!("{:#?}", err);
            }
        };
        rocket.launch()
    }
}