splash 0.2.0

A decentralized network for sharing offers across the Chia ecosystem
Documentation
use serde::Serialize;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;

#[derive(Clone, Debug)]
pub struct Metrics {
    peers: Arc<AtomicUsize>,
    offers_broadcasted: Arc<AtomicUsize>,
    offers_received: Arc<AtomicUsize>,
    total_connections: Arc<AtomicUsize>,
}

impl Metrics {
    pub fn new() -> Self {
        Self {
            peers: Arc::new(AtomicUsize::new(0)),
            offers_broadcasted: Arc::new(AtomicUsize::new(0)),
            offers_received: Arc::new(AtomicUsize::new(0)),
            total_connections: Arc::new(AtomicUsize::new(0)),
        }
    }

    pub fn increment_peers(&self) -> usize {
        self.peers.fetch_add(1, Ordering::SeqCst) + 1
    }

    pub fn decrement_peers(&self) -> usize {
        self.peers.fetch_sub(1, Ordering::SeqCst) - 1
    }

    pub fn increment_offers_received(&self) {
        self.offers_received.fetch_add(1, Ordering::SeqCst);
    }

    pub fn increment_offers_broadcasted(&self) {
        self.offers_broadcasted.fetch_add(1, Ordering::SeqCst);
    }

    pub fn get_metrics(&self) -> MetricsData {
        MetricsData {
            peers: self.peers.load(Ordering::SeqCst),
            offers_broadcasted: self.offers_broadcasted.load(Ordering::SeqCst),
            offers_received: self.offers_received.load(Ordering::SeqCst),
            total_connections: self.total_connections.load(Ordering::SeqCst),
        }
    }
}

#[derive(Serialize)]
pub struct MetricsData {
    pub peers: usize,
    pub offers_broadcasted: usize,
    pub offers_received: usize,
    pub total_connections: usize,
}