extern crate heatmap;
extern crate histogram;
use std::fmt::Display;
use std::hash::Hash;
use std::marker::PhantomData;
use receiver::Receiver;
use heatmap::Heatmap;
use histogram::Histogram;
#[derive(Clone)]
pub struct Config<T> {
pub duration: usize,
pub windows: usize,
pub capacity: usize,
pub http_listen: Option<String>,
pub trace_file: Option<String>,
pub waterfall_file: Option<String>,
pub heatmap_config: heatmap::Config,
pub histogram_config: histogram::Config,
resource_type: PhantomData<T>,
}
impl<T: Hash + Eq + Send + Display + Clone> Default for Config<T> {
fn default() -> Config<T> {
let heatmap_config = Heatmap::configure()
.slice_duration(1_000_000_000)
.precision(2);
let histogram_config = Histogram::configure()
.max_value(60 * 1_000_000_000)
.precision(4);
Config {
duration: 60,
windows: 60,
capacity: 1000,
http_listen: None,
trace_file: None,
waterfall_file: None,
heatmap_config: heatmap_config,
histogram_config: histogram_config,
resource_type: PhantomData::<T>,
}
}
}
impl<T: Hash + Eq + Send + Display + Clone> Config<T> {
pub fn new() -> Config<T> {
Default::default()
}
pub fn duration(mut self, duration: usize) -> Self {
self.duration = duration;
self.heatmap_config.num_slices(self.duration * self.windows);
self
}
pub fn windows(mut self, windows: usize) -> Self {
self.windows = windows;
self.heatmap_config.num_slices(self.duration * self.windows);
self
}
pub fn capacity(mut self, capacity: usize) -> Self {
self.capacity = capacity;
self
}
pub fn http_listen(mut self, address: String) -> Self {
self.http_listen = Some(address);
self
}
pub fn trace_file(mut self, path: String) -> Self {
self.trace_file = Some(path);
self
}
pub fn waterfall_file(mut self, path: String) -> Self {
self.waterfall_file = Some(path);
self
}
pub fn build(self) -> Receiver<T> {
Receiver::configured(self)
}
}