///|
pub(all) struct MultiWindowReport {
target : SloTarget
reports : Array[BurnReport]
decisions : Array[AlertDecision]
} derive(Eq, Debug)
///|
pub fn evaluate_multi_window(
target : SloTarget,
windows : Array[RequestWindow],
rules : Array[BurnRule],
) -> MultiWindowReport {
let reports : Array[BurnReport] = []
let decisions : Array[AlertDecision] = []
let count = min_int(windows.length(), rules.length())
for i = 0; i < count; i = i + 1 {
let report = calculate_burn_rate(target, windows[i])
reports.push(report)
decisions.push(evaluate_burn_rule(report, rules[i]))
}
{ target, reports, decisions }
}
///|
pub fn MultiWindowReport::highest_level(self : MultiWindowReport) -> AlertLevel {
let mut level = Ok
for i = 0; i < self.decisions.length(); i = i + 1 {
if alert_rank(self.decisions[i].level) > alert_rank(level) {
level = self.decisions[i].level
}
}
level
}
///|
fn alert_rank(level : AlertLevel) -> Int {
match level {
Ok => 0
Ticket => 1
Page => 2
}
}
///|
fn min_int(a : Int, b : Int) -> Int {
if a < b {
a
} else {
b
}
}