tempest 0.1.0

Realtime message handling framework inspired by Apache Storm and built with Actix
Documentation
use crate::common::logger::*;
use config;
use serde_derive::Deserialize;

/// Config is used to parse `Topology.toml` files

static TARGET_SERVICE_CONFIG: &'static str = "tempest::service::config";

fn read_config(path: &str) -> Result<config::Config, config::ConfigError> {
    let mut file = config::Config::default();
    match file.merge(config::File::with_name(path)) {
        Ok(file) => Ok(file.to_owned()),
        Err(err) => Err(err),
    }
}

pub fn get_topology_config(path: &str) -> Result<TopologyConfig, config::ConfigError> {
    match read_config(path) {
        Ok(config) => {
            let topology: TopologyConfig = config.try_into()?;
            debug!(
                target: TARGET_SERVICE_CONFIG,
                "Topology config: {:?}", &topology
            );
            Ok(topology)
        }
        Err(err) => Err(err),
    }
}

#[derive(Debug, Deserialize)]
pub struct TopologyConfig {
    pub name: String,
    pub host: Option<String>,
    pub port: Option<String>,
    pub graceful_shutdown: Option<u64>,
    pub task: Vec<TaskConfig>,
    pub source: Option<SourceConfig>,
    pub metric: Option<MetricConfig>,
}

#[derive(Debug, Deserialize)]
pub struct TaskConfig {
    pub name: String,
    pub workers: Option<u64>,
    pub poll_interval: Option<u64>,
    pub poll_count: Option<u16>,
    pub max_backoff: Option<u64>,
}

#[derive(Debug, Deserialize)]
pub struct SourceConfig {
    pub config: config::Value,
}

#[derive(Debug, Deserialize)]
pub struct MetricConfig {
    pub flush_interval: Option<u64>,
    pub target: Vec<config::Value>,
}