-
Notifications
You must be signed in to change notification settings - Fork 296
/
render.rs
93 lines (72 loc) · 2.17 KB
/
render.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use std::time::Instant;
use anyhow::Error;
use opentelemetry::KeyValue;
use serde::Serialize;
use crate::metrics::{MetricParams, WithMetrics};
#[derive(Debug, PartialEq, Serialize)]
pub struct Context<'a> {
pub name: &'a str,
pub ssl_certificate_key_path: &'a str,
pub ssl_certificate_path: &'a str,
}
pub trait Render: Sync + Send {
fn render(&self, cx: &Context) -> Result<String, Error>;
}
pub struct Renderer {
template: String,
}
impl Renderer {
pub fn new(template: &str) -> Self {
Self {
template: template.to_owned(),
}
}
}
impl Render for Renderer {
fn render(&self, cx: &Context) -> Result<String, Error> {
let out = self.template.clone();
let out = out.replace("{name}", cx.name);
let out = out.replace("{ssl_certificate_key_path}", cx.ssl_certificate_key_path);
let out = out.replace("{ssl_certificate_path}", cx.ssl_certificate_path);
Ok(out)
}
}
impl<T: Render> Render for WithMetrics<T> {
fn render(&self, cx: &Context) -> Result<String, Error> {
let start_time = Instant::now();
let out = self.0.render(cx);
let status = if out.is_ok() { "ok" } else { "fail" };
let duration = start_time.elapsed().as_secs_f64();
let labels = &[KeyValue::new("status", status)];
let MetricParams {
counter, recorder, ..
} = &self.1;
counter.add(1, labels);
recorder.record(duration, labels);
out
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_render() {
let r = Renderer::new("{name}|{ssl_certificate_key_path}|{ssl_certificate_path}");
let out = r
.render(&Context {
name: "A",
ssl_certificate_key_path: "2",
ssl_certificate_path: "3",
})
.expect("failed to render");
assert_eq!(out, "A|2|3");
let out = r
.render(&Context {
name: "X",
ssl_certificate_key_path: "2",
ssl_certificate_path: "3",
})
.expect("failed to render");
assert_eq!(out, "X|2|3");
}
}