canic_core/workflow/log/
query.rs

1use crate::{
2    dto::{
3        log::LogEntryView,
4        page::{Page, PageRequest},
5    },
6    log::Level,
7    ops::runtime::log::LogOps,
8    workflow::{log::mapper::LogMapper, view::paginate::paginate_vec},
9};
10
11///
12/// LogQuery
13/// Read-only log views and pagination helpers.
14///
15
16pub struct LogQuery;
17
18impl LogQuery {
19    #[must_use]
20    pub fn page(
21        crate_name: Option<String>,
22        topic: Option<String>,
23        min_level: Option<Level>,
24        page: PageRequest,
25    ) -> Page<LogEntryView> {
26        let mut entries = LogOps::snapshot();
27
28        // Filter
29        if let Some(ref name) = crate_name {
30            entries.retain(|e| &e.crate_name == name);
31        }
32        if let Some(ref t) = topic {
33            entries.retain(|e| e.topic.as_deref() == Some(t.as_str()));
34        }
35        if let Some(min) = min_level {
36            entries.retain(|e| e.level >= min);
37        }
38
39        // Newest first
40        entries.sort_by(|a, b| b.created_at.cmp(&a.created_at));
41
42        let views: Vec<LogEntryView> = entries.iter().map(LogMapper::entry_to_view).collect();
43
44        paginate_vec(views, page)
45    }
46}