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}