use sim_kernel::{Error, Result, Symbol};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ClockDomain {
Sample,
Block,
Control,
MidiTick,
Wall,
Transport,
ServerFrame,
BrowserFrame,
TraceStep,
Job,
}
impl ClockDomain {
pub fn wire_label(self) -> &'static str {
match self {
Self::Sample => "sample",
Self::Block => "block",
Self::Control => "control",
Self::MidiTick => "midi-tick",
Self::Wall => "wall",
Self::Transport => "transport",
Self::ServerFrame => "server-frame",
Self::BrowserFrame => "browser-frame",
Self::TraceStep => "trace-step",
Self::Job => "job",
}
}
pub fn symbol(self) -> Symbol {
Symbol::qualified("stream/clock-domain", self.wire_label())
}
pub fn from_symbol(symbol: &Symbol) -> Result<Self> {
match symbol.as_qualified_str().as_str() {
"sample" | "clock/sample" | "stream/clock-domain/sample" => Ok(Self::Sample),
"block" | "clock/block" | "stream/clock-domain/block" => Ok(Self::Block),
"control" | "clock/control" | "stream/clock-domain/control" => Ok(Self::Control),
"midi"
| "midi-tick"
| "clock/midi"
| "clock/midi-tick"
| "stream/clock-domain/midi-tick" => Ok(Self::MidiTick),
"wall" | "clock/wall" | "stream/clock-domain/wall" => Ok(Self::Wall),
"transport" | "clock/transport" | "stream/clock-domain/transport" => {
Ok(Self::Transport)
}
"server-frame" | "clock/server-frame" | "stream/clock-domain/server-frame" => {
Ok(Self::ServerFrame)
}
"browser-frame" | "clock/browser-frame" | "stream/clock-domain/browser-frame" => {
Ok(Self::BrowserFrame)
}
"trace-step" | "clock/trace-step" | "stream/clock-domain/trace-step" => {
Ok(Self::TraceStep)
}
"job" | "clock/job" | "stream/clock-domain/job" => Ok(Self::Job),
other => Err(Error::Eval(format!("unknown stream clock domain {other}"))),
}
}
pub fn for_stream_clock(symbol: &Symbol) -> Result<Self> {
Self::from_symbol(symbol)
}
}