///|
pub fn AlertDecision::level_name(self : AlertDecision) -> String {
self.level.name()
}
///|
pub fn AlertLevel::name(self : AlertLevel) -> String {
match self {
Ok => "ok"
Page => "page"
Ticket => "ticket"
}
}
///|
pub fn BudgetReport::to_json(self : BudgetReport) -> String {
"{\"target\":\"\{escape_json(self.target.name)}\",\"window\":\"\{escape_json(self.window.name)}\",\"allowed_bad\":\{self.allowed_bad},\"actual_bad\":\{self.actual_bad},\"consumed_bp\":\{self.consumed_bp},\"remaining_bad\":\{self.remaining_bad}}"
}
///|
pub fn AlertDecision::to_json(self : AlertDecision) -> String {
"{\"level\":\"\{self.level_name()}\",\"rule\":\"\{escape_json(self.rule_name)}\",\"burn_rate_x100\":\{self.burn_rate_x100},\"reason\":\"\{escape_json(self.reason)}\"}"
}
///|
pub fn BurnReport::to_json(self : BurnReport) -> String {
"{\"window\":\"\{escape_json(self.window.name)}\",\"allowed_error_bp\":\{self.allowed_error_bp},\"observed_error_bp\":\{self.observed_error_bp},\"burn_rate_x100\":\{self.burn_rate_x100}}"
}
///|
pub fn BudgetForecast::to_json(self : BudgetForecast) -> String {
"{\"target\":\"\{escape_json(self.report.target.name)}\",\"window\":\"\{escape_json(self.report.window.name)}\",\"bad_per_hour_x100\":\{self.bad_per_hour_x100},\"minutes_to_exhaustion\":\{self.minutes_to_exhaustion},\"state\":\"\{escape_json(self.state)}\"}"
}
///|
pub fn GateDecision::to_json(self : GateDecision) -> String {
"{\"gate\":\"\{escape_json(self.gate_name)}\",\"allowed\":\{self.allowed},\"reason\":\"\{escape_json(self.reason)}\",\"consumed_bp\":\{self.consumed_bp},\"level\":\"\{self.highest_level.name()}\"}"
}
///|
pub fn ServiceEvaluation::to_json(self : ServiceEvaluation) -> String {
"{\"service\":\"\{escape_json(self.service)}\",\"target\":\"\{escape_json(self.target_name)}\",\"healthy\":\{self.healthy()},\"gate\":\{self.gate.to_json()}}"
}
///|
pub fn SloAnnotation::to_json(self : SloAnnotation) -> String {
"{\"minute\":\{self.minute},\"kind\":\"\{escape_json(self.kind)}\",\"message\":\"\{escape_json(self.message)}\"}"
}
///|
fn escape_json(text : String) -> String {
let buf = StringBuilder(size_hint=text.length() + 8)
for i = 0; i < text.length(); i = i + 1 {
match text.get_char(i) {
Some('\\') => buf.write_string("\\\\")
Some('"') => buf.write_string("\\\"")
Some('\b') => buf.write_string("\\b")
Some('\u{000C}') => buf.write_string("\\f")
Some('\n') => buf.write_string("\\n")
Some('\r') => buf.write_string("\\r")
Some('\t') => buf.write_string("\\t")
Some(ch) =>
if ch.to_int() < 32 {
let digits = "0123456789abcdef"
buf.write_string("\\u00")
buf.write_char(digits.get_char(ch.to_int() / 16).unwrap())
buf.write_char(digits.get_char(ch.to_int() % 16).unwrap())
} else {
buf.write_char(ch)
}
None => ()
}
}
buf.to_string()
}