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
use crate::{errors::BufkitDataErr, models::Model, site::Site};
use chrono::{Duration, NaiveDateTime};
#[derive(Debug, PartialEq, Eq)]
pub struct Inventory {
pub first: NaiveDateTime,
pub last: NaiveDateTime,
pub missing: Vec<(NaiveDateTime, NaiveDateTime)>,
pub auto_download: bool,
}
impl Inventory {
pub(crate) fn new(
init_times: impl IntoIterator<Item = NaiveDateTime>,
model: Model,
site: &Site,
) -> Result<Self, BufkitDataErr> {
let mut init_times = init_times.into_iter();
let delta_hours = Duration::hours(model.hours_between_runs());
let first = init_times
.by_ref()
.next()
.ok_or(BufkitDataErr::NotEnoughData)?;
let mut missing = vec![];
let mut next_init_time = first;
for init_time in init_times {
next_init_time += delta_hours;
if next_init_time < init_time {
let start = next_init_time;
let last = init_time - delta_hours;
missing.push((start, last));
}
while next_init_time < init_time {
next_init_time += delta_hours;
}
}
let last = next_init_time;
let auto_download = site.auto_download;
Ok(Inventory {
first,
last,
missing,
auto_download,
})
}
}