sim_lib_stream_core/
time.rs1use sim_kernel::{Error, Ref, Result, Symbol, Tick};
9
10pub const CLOCK_INDEX_REF_NAMESPACE: &str = "stream/clock-index";
12
13#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
15pub struct ClockTickIndex(u64);
16
17impl ClockTickIndex {
18 pub fn new(value: u64) -> Self {
20 Self(value)
21 }
22
23 pub fn value(self) -> u64 {
25 self.0
26 }
27}
28
29pub fn clock_index_ref(index: u64) -> Ref {
34 Ref::Symbol(clock_index_symbol(index))
35}
36
37pub fn clock_index_symbol(index: u64) -> Symbol {
39 Symbol::qualified(CLOCK_INDEX_REF_NAMESPACE, index.to_string())
40}
41
42pub fn tick_clock_index(tick: &Tick, expected_clock: &Symbol) -> Result<Option<ClockTickIndex>> {
48 if &tick.clock != expected_clock {
49 return Ok(None);
50 }
51 let Ref::Symbol(symbol) = &tick.index else {
52 return Err(incomparable_tick_error(tick));
53 };
54 if symbol.namespace.as_deref() != Some(CLOCK_INDEX_REF_NAMESPACE) {
55 return Err(incomparable_tick_error(tick));
56 }
57 let index = symbol.name.parse::<u64>().map_err(|err| {
58 Error::Eval(format!(
59 "stream tick on clock {} has invalid semantic index {}: {err}",
60 tick.clock.as_qualified_str(),
61 symbol.name
62 ))
63 })?;
64 Ok(Some(ClockTickIndex::new(index)))
65}
66
67fn incomparable_tick_error(tick: &Tick) -> Error {
68 Error::Eval(format!(
69 "stream tick on clock {} has incomparable index {:?}; expected {CLOCK_INDEX_REF_NAMESPACE}/<u64>",
70 tick.clock.as_qualified_str(),
71 tick.index
72 ))
73}