canic_core/workflow/log/
query.rs1use 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
11pub 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 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 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}