Skip to main content

sim_lib_stream_core/
cookbook.rs

1//! Deterministic cookbook builders for stream-core recipes.
2
3use sim_kernel::{Expr, Symbol};
4
5use crate::{BufferPolicy, ClockDomain, StreamDirection, StreamMedia, StreamMetadata};
6
7/// Build the modeled metadata descriptor used by the cookbook recipe.
8pub fn metadata_descriptor_demo() -> Expr {
9    let metadata = StreamMetadata::new(
10        Symbol::qualified("stream/demo", "inbound-data"),
11        StreamMedia::Data,
12        StreamDirection::Source,
13        ClockDomain::ServerFrame.symbol(),
14        BufferPolicy::bounded(8).expect("cookbook buffer is bounded"),
15    );
16    metadata.table_expr()
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22
23    #[test]
24    fn metadata_descriptor_round_trips_through_constructor_args() {
25        let Expr::Map(entries) = metadata_descriptor_demo() else {
26            panic!("metadata demo is a map")
27        };
28        assert!(entries.iter().any(|(_, value)| {
29            matches!(value, Expr::Symbol(symbol) if symbol.as_qualified_str() == "stream/media/data")
30        }));
31
32        let metadata = StreamMetadata::new(
33            Symbol::qualified("stream/demo", "inbound-data"),
34            StreamMedia::Data,
35            StreamDirection::Source,
36            ClockDomain::ServerFrame.symbol(),
37            BufferPolicy::bounded(8).expect("valid buffer"),
38        );
39        let rebuilt = StreamMetadata::from_constructor_args(metadata.to_constructor_args())
40            .expect("constructor args rebuild metadata");
41        assert_eq!(rebuilt.id(), metadata.id());
42        assert_eq!(rebuilt.media(), StreamMedia::Data);
43    }
44}