Mercurial > lbo > hg > myi3stat
view src/render.rs @ 34:cd2dddf95416
Make renderers modular. Add standard i3status renderer.
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Thu, 18 Feb 2016 15:55:27 +0100 |
parents | |
children | b0f65be9464d |
line wrap: on
line source
use framework::*; pub trait Renderer { fn init(&mut self, metrics: Vec<ActiveMetric>) -> String; fn render(&mut self) -> String; } struct I3statRenderer { metrics: Vec<ActiveMetric>, } impl I3statRenderer { fn new() -> I3statRenderer { I3statRenderer { metrics: Vec::new() } } } impl Renderer for I3statRenderer { fn init(&mut self, metrics: Vec<ActiveMetric>) -> String { self.metrics = metrics; String::from("{\"version\":1}\n[[]\n") } fn render(&mut self) -> String { let mut render_result = self.metrics .iter_mut() .map(|m| m.render()) .fold(String::from(""), |mut out, rendres| { out.push_str(&rendres.to_json()); out.push_str(","); out }); render_result.pop(); format!(",[{}]", render_result) } } pub fn make_i3status() -> Box<Renderer> { Box::new(I3statRenderer::new()) } pub fn render_loop(mut r: Box<Renderer>, metrics: Vec<ActiveMetric>, interval: i32) { use std::thread::sleep; use std::time::Duration; let ival_duration = Duration::new((interval / 1000) as u64, 1000000 * (interval as u32 % 1000)); print!("{}", r.init(metrics)); loop { println!("{}", r.render()); sleep(ival_duration); } }