lash_core/runtime/process/
references.rs1use 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}