Skip to main content

lash_core/runtime/process/
references.rs

1use serde::{Deserialize, Serialize};
2
3use super::model::{ProcessExecutionEnvRef, ProcessRecord};
4
5#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
6pub struct ProcessLiveReferenceSummary {
7    pub definition: Option<serde_json::Value>,
8    pub env_ref: Option<ProcessExecutionEnvRef>,
9    pub process_count: usize,
10}
11
12impl ProcessLiveReferenceSummary {
13    pub fn from_records<'record>(
14        records: impl IntoIterator<Item = &'record ProcessRecord>,
15    ) -> Vec<Self> {
16        let mut summaries: Vec<Self> = Vec::new();
17        for record in records {
18            if record.is_terminal() {
19                continue;
20            }
21            if let Some(summary) = summaries.iter_mut().find(|summary| {
22                summary.definition == record.identity.definition
23                    && summary.env_ref == record.env_ref
24            }) {
25                summary.process_count += 1;
26            } else {
27                summaries.push(Self {
28                    definition: record.identity.definition.clone(),
29                    env_ref: record.env_ref.clone(),
30                    process_count: 1,
31                });
32            }
33        }
34        summaries.sort_by_key(live_reference_sort_key);
35        summaries
36    }
37}
38
39fn live_reference_sort_key(summary: &ProcessLiveReferenceSummary) -> (String, String) {
40    let definition = summary
41        .definition
42        .as_ref()
43        .map(|definition| serde_json::to_string(definition).expect("definition serializes"))
44        .unwrap_or_default();
45    let env_ref = summary
46        .env_ref
47        .as_ref()
48        .map(|env_ref| env_ref.as_str().to_string())
49        .unwrap_or_default();
50    (definition, env_ref)
51}