MCPcopy Create free account
hub / github.com/ccusage/ccusage / identify_session_blocks

Function identify_session_blocks

rust/crates/ccusage/src/blocks.rs:17–67  ·  view source on GitHub ↗
(
    mut entries: Vec<LoadedEntry>,
    session_duration_hours: f64,
)

Source from the content-addressed store, hash-verified

15};
16
17pub(crate) fn identify_session_blocks(
18 mut entries: Vec<LoadedEntry>,
19 session_duration_hours: f64,
20) -> Vec<SessionBlock> {
21 if entries.is_empty() {
22 return Vec::new();
23 }
24 let session_duration = (session_duration_hours * MILLIS_PER_HOUR as f64) as i64;
25 entries.sort_by_key(|entry| entry.timestamp);
26 let now = utc_now();
27 let mut blocks = Vec::new();
28 let mut current_start: Option<TimestampMs> = None;
29 let mut current_entries = Vec::new();
30
31 for entry in entries {
32 if let Some(start) = current_start {
33 let last_time = current_entries
34 .last()
35 .map(|entry: &LoadedEntry| entry.timestamp)
36 .unwrap_or(start);
37 let since_start = entry.timestamp.duration_since(start);
38 let since_last = entry.timestamp.duration_since(last_time);
39 if since_start > session_duration || since_last > session_duration {
40 blocks.push(create_block(
41 start,
42 std::mem::take(&mut current_entries),
43 now,
44 session_duration,
45 ));
46 if since_last > session_duration {
47 blocks.push(create_gap_block(
48 last_time,
49 entry.timestamp,
50 session_duration,
51 ));
52 }
53 current_start = Some(floor_to_hour(entry.timestamp));
54 }
55 } else {
56 current_start = Some(floor_to_hour(entry.timestamp));
57 }
58 current_entries.push(entry);
59 }
60
61 if let Some(start) = current_start
62 && !current_entries.is_empty()
63 {
64 blocks.push(create_block(start, current_entries, now, session_duration));
65 }
66 blocks
67}
68
69fn floor_to_hour(timestamp: TimestampMs) -> TimestampMs {
70 timestamp.floor_to_hour()

Callers 2

run_blocksFunction · 0.85
render_statuslineFunction · 0.85

Calls 6

utc_nowFunction · 0.85
create_blockFunction · 0.85
create_gap_blockFunction · 0.85
floor_to_hourFunction · 0.85
duration_sinceMethod · 0.80
pushMethod · 0.80

Tested by

no test coverage detected