daedalus_core/lib.rs
1//! Base plumbing for the Daedalus pipeline stack.
2//!
3//! This crate is intentionally small and feature-light: it owns IDs, errors,
4//! clocks/ticks, message envelopes, channel primitives, and (optionally) a tiny
5//! metrics facade. Higher layers (`daedalus-data`, `daedalus-registry`,
6//! planner/runtime crates) depend on these building blocks and must not inject
7//! new global state or cfg mazes here.
8//!
9//! IDs serialize deterministically as `"prefix:n"` strings (e.g., `"node:1"`,
10//! `"edge:7"`) to keep planner/runtime diagnostics and golden outputs stable.
11//! Message payloads are generic; callers are expected to uphold any `Send`/`Sync`
12//! guarantees required by their runtime context.
13//!
14//! # Examples
15//! Send/recv on a bounded channel:
16//! ```
17//! use daedalus_core::channels::{bounded, ChannelRecv, ChannelSend, RecvOutcome};
18//!
19//! let (tx, rx) = bounded(2);
20//! assert_eq!(tx.send(1), daedalus_core::channels::Backpressure::Ok);
21//! assert_eq!(tx.send(2), daedalus_core::channels::Backpressure::Ok);
22//! assert_eq!(rx.try_recv(), RecvOutcome::Data(1));
23//! assert_eq!(rx.try_recv(), RecvOutcome::Data(2));
24//! ```
25//!
26//! Manual tick clock:
27//! ```
28//! use daedalus_core::clock::TickClock;
29//! let clock = TickClock::default();
30//! let t1 = clock.tick();
31//! let t2 = clock.advance(5);
32//! assert!(t2.value() > t1.value());
33//! ```
34//!
35//! **Concurrency/typing notes:** channel factories enforce `Send` on payloads;
36//! if your runtime requires `Sync` as well, enforce it at your boundary (e.g.,
37//! `ChannelSend<Arc<T>>` with `T: Send + Sync`). IDs serialize as `"prefix:n"`
38//! strings for stable planner/runtime diagnostics and goldens.
39
40pub mod channels;
41pub mod clock;
42pub mod compute;
43pub mod errors;
44pub mod ids;
45pub mod messages;
46pub mod policy;
47pub mod sync;
48
49#[cfg(feature = "metrics")]
50pub mod metrics;
51
52/// Commonly used types re-exported for convenience.
53pub mod prelude {
54 pub use crate::channels::{Backpressure, ChannelRecv, ChannelSend, RecvOutcome};
55 pub use crate::clock::{Tick, TickClock};
56 pub use crate::errors::{CoreError, CoreErrorCode};
57 pub use crate::ids::{ChannelId, EdgeId, NodeId, PortId, RunId, TickId};
58 pub use crate::messages::{Message, MessageMeta, Sequence, Token, Watermark};
59
60 #[cfg(feature = "metrics")]
61 pub use crate::metrics::{MetricsSink, NoopMetrics};
62}