mollysocket 1.7.1

MollySocket allows getting signal notifications via UnifiedPush.
use std::fmt::Display;

use eyre::Result;
use rocket::{http::uri::Origin, Build, Rocket};
use rocket_prometheus::{
    prometheus::{register_int_counter, register_int_gauge, IntCounter, IntGauge},
    PrometheusMetrics,
};

pub struct Metrics {
    pub connections: IntGauge,
    pub forbiddens: IntGauge,
    pub reconnections: IntCounter,
    pub messages: IntCounter,
    pub pushs: IntCounter,
}

impl Metrics {
    pub fn new() -> Result<Self> {
        let connections =
            register_int_gauge!("mollysocket_connections", "Connections to Signal server")?;
        let forbiddens = register_int_gauge!(
            "mollysocket_forbiddens",
            "Forbidden connections to Signal server"
        )?;
        let reconnections =
            register_int_counter!("mollysocket_reconnections", "Reconnections since the start")?;
        let messages =
            register_int_counter!("mollysocket_messages", "Messages received from Signal")?;
        let pushs = register_int_counter!(
            "mollysocket_pushs",
            "Push messages sent to UnifiedPush endpoint"
        )?;

        Ok(Self {
            connections,
            forbiddens,
            reconnections,
            messages,
            pushs,
        })
    }
}

pub trait MountMetrics {
    fn mount_metrics<'a, B>(self, base: B, metrics: &Metrics) -> Self
    where
        B: TryInto<Origin<'a>> + Clone + Display,
        B::Error: Display;
}

impl MountMetrics for Rocket<Build> {
    fn mount_metrics<'a, B>(self, base: B, metrics: &Metrics) -> Self
    where
        B: TryInto<Origin<'a>> + Clone + Display,
        B::Error: Display,
    {
        let prometheus = PrometheusMetrics::new();
        let prom_registry = prometheus.registry();
        prom_registry
            .register(Box::new(metrics.connections.clone()))
            .unwrap();
        prom_registry
            .register(Box::new(metrics.forbiddens.clone()))
            .unwrap();
        prom_registry
            .register(Box::new(metrics.reconnections.clone()))
            .unwrap();
        prom_registry
            .register(Box::new(metrics.messages.clone()))
            .unwrap();
        prom_registry
            .register(Box::new(metrics.pushs.clone()))
            .unwrap();

        self.attach(prometheus.clone()).mount(base, prometheus)
    }
}