dora_message/
coordinator_to_cli.rs

1use 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}