micromegas-analytics 0.1.6

analytics module of micromegas
Documentation
use super::{log_view::LogViewMaker, metrics_view::MetricsViewMaker, view::View};
use anyhow::Result;
use std::{collections::HashMap, sync::Arc};

pub trait ViewMaker: Send + Sync {
    fn make_view(&self, view_instance_id: &str) -> Result<Arc<dyn View>>;
}

pub struct ViewFactory {
    view_sets: HashMap<String, Arc<dyn ViewMaker>>,
}

impl ViewFactory {
    pub fn new() -> Self {
        Self {
            view_sets: HashMap::new(),
        }
    }

    pub fn add_view_set(&mut self, view_set_name: String, maker: Arc<dyn ViewMaker>) {
        self.view_sets.insert(view_set_name, maker);
    }

    pub fn make_view(&self, view_set_name: &str, view_instance_id: &str) -> Result<Arc<dyn View>> {
        if let Some(maker) = self.view_sets.get(view_set_name) {
            maker.make_view(view_instance_id)
        } else {
            anyhow::bail!("view set not found");
        }
    }
}

impl Default for ViewFactory {
    fn default() -> Self {
        let mut factory = Self::new();
        factory.add_view_set(String::from("log_entries"), Arc::new(LogViewMaker {}));
        factory.add_view_set(String::from("measures"), Arc::new(MetricsViewMaker {}));
        factory
    }
}