dora_message/
coordinator_to_cli.rs1use std::collections::{BTreeMap, BTreeSet};
2
3use uuid::Uuid;
4
5pub use crate::common::{LogLevel, LogMessage, NodeError, NodeErrorCause, NodeExitStatus};
6use crate::{common::DaemonId, id::NodeId};
7
8#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
9pub enum ControlRequestReply {
10 Error(String),
11 CoordinatorStopped,
12 DataflowStarted { uuid: Uuid },
13 DataflowReloaded { uuid: Uuid },
14 DataflowStopped { uuid: Uuid, result: DataflowResult },
15 DataflowList(DataflowList),
16 DestroyOk,
17 DaemonConnected(bool),
18 ConnectedDaemons(BTreeSet<DaemonId>),
19 Logs(Vec<u8>),
20}
21
22#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
23pub struct DataflowResult {
24 pub uuid: Uuid,
25 pub timestamp: uhlc::Timestamp,
26 pub node_results: BTreeMap<NodeId, Result<(), NodeError>>,
27}
28
29impl DataflowResult {
30 pub fn ok_empty(uuid: Uuid, timestamp: uhlc::Timestamp) -> Self {
31 Self {
32 uuid,
33 timestamp,
34 node_results: Default::default(),
35 }
36 }
37
38 pub fn is_ok(&self) -> bool {
39 self.node_results.values().all(|r| r.is_ok())
40 }
41}
42
43#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
44pub struct DataflowList(pub Vec<DataflowListEntry>);
45
46impl DataflowList {
47 pub fn get_active(&self) -> Vec<DataflowIdAndName> {
48 self.0
49 .iter()
50 .filter(|d| d.status == DataflowStatus::Running)
51 .map(|d| d.id.clone())
52 .collect()
53 }
54}
55
56#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
57pub struct DataflowListEntry {
58 pub id: DataflowIdAndName,
59 pub status: DataflowStatus,
60}
61
62#[derive(Debug, Clone, Copy, serde::Deserialize, serde::Serialize, PartialEq, Eq)]
63pub enum DataflowStatus {
64 Running,
65 Finished,
66 Failed,
67}
68
69#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
70pub struct DataflowIdAndName {
71 pub uuid: Uuid,
72 pub name: Option<String>,
73}
74
75impl std::fmt::Display for DataflowIdAndName {
76 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77 if let Some(name) = &self.name {
78 write!(f, "[{name}] {}", self.uuid)
79 } else {
80 write!(f, "[<unnamed>] {}", self.uuid)
81 }
82 }
83}