daedalus_core/sync.rs
1use serde::{Deserialize, Serialize};
2
3/// How to align multiple input ports within a sync group.
4///
5/// ```
6/// use daedalus_core::sync::SyncPolicy;
7/// let policy = SyncPolicy::Latest;
8/// assert_eq!(policy, SyncPolicy::Latest);
9/// ```
10#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Default)]
11pub enum SyncPolicy {
12 /// Wait until all ports in the group have at least one payload.
13 #[default]
14 AllReady,
15 /// Use the latest payload per port, emit immediately on any arrival.
16 Latest,
17 /// Align by an external tag (implementation-defined).
18 ZipByTag,
19}
20
21/// Sync grouping metadata for a node.
22///
23/// ```
24/// use daedalus_core::sync::{SyncGroup, SyncPolicy};
25///
26/// let group = SyncGroup {
27/// name: "aligned".to_string(),
28/// policy: SyncPolicy::AllReady,
29/// backpressure: None,
30/// capacity: Some(4),
31/// ports: vec!["left".into(), "right".into()],
32/// };
33/// assert_eq!(group.ports.len(), 2);
34/// ```
35#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default)]
36pub struct SyncGroup {
37 /// Logical name for the group.
38 pub name: String,
39 /// Alignment policy for this group.
40 pub policy: SyncPolicy,
41 /// Optional override for backpressure strategy; defaults to engine setting.
42 #[serde(default)]
43 pub backpressure: Option<crate::policy::BackpressureStrategy>,
44 /// Optional override for buffer capacity; defaults to engine/edge depth.
45 #[serde(default)]
46 pub capacity: Option<usize>,
47 /// Ports that participate in this group.
48 pub ports: Vec<String>,
49}