use std::collections::HashMap;
use std::sync::Arc;
use crate::token_payload::TokenPayload;
#[derive(Debug, Clone)]
pub enum NetEvent {
ExecutionStarted { net_name: Arc<str>, timestamp: u64 },
ExecutionCompleted { net_name: Arc<str>, timestamp: u64 },
TransitionEnabled {
transition_name: Arc<str>,
timestamp: u64,
},
TransitionClockRestarted {
transition_name: Arc<str>,
timestamp: u64,
},
TransitionStarted {
transition_name: Arc<str>,
timestamp: u64,
},
TransitionCompleted {
transition_name: Arc<str>,
timestamp: u64,
},
TransitionFailed {
transition_name: Arc<str>,
error: String,
timestamp: u64,
},
TransitionTimedOut {
transition_name: Arc<str>,
timestamp: u64,
},
ActionTimedOut {
transition_name: Arc<str>,
timeout_ms: u64,
timestamp: u64,
},
#[non_exhaustive]
TokenAdded {
place_name: Arc<str>,
timestamp: u64,
token: Option<Arc<dyn TokenPayload>>,
},
#[non_exhaustive]
TokenRemoved {
place_name: Arc<str>,
timestamp: u64,
token: Option<Arc<dyn TokenPayload>>,
},
LogMessage {
transition_name: Arc<str>,
level: String,
message: String,
timestamp: u64,
},
MarkingSnapshot {
marking: HashMap<Arc<str>, usize>,
timestamp: u64,
},
}
pub fn instance_prefix_of(name: &str) -> Option<&str> {
let idx = name.rfind('/')?;
if idx == 0 {
return None;
}
Some(&name[..idx])
}
impl NetEvent {
pub fn token_added(place_name: Arc<str>, timestamp: u64) -> Self {
Self::TokenAdded { place_name, timestamp, token: None }
}
pub fn token_added_with(
place_name: Arc<str>,
timestamp: u64,
token: Arc<dyn TokenPayload>,
) -> Self {
Self::TokenAdded { place_name, timestamp, token: Some(token) }
}
pub fn token_removed(place_name: Arc<str>, timestamp: u64) -> Self {
Self::TokenRemoved { place_name, timestamp, token: None }
}
pub fn token_removed_with(
place_name: Arc<str>,
timestamp: u64,
token: Arc<dyn TokenPayload>,
) -> Self {
Self::TokenRemoved { place_name, timestamp, token: Some(token) }
}
pub fn timestamp(&self) -> u64 {
match self {
NetEvent::ExecutionStarted { timestamp, .. }
| NetEvent::ExecutionCompleted { timestamp, .. }
| NetEvent::TransitionEnabled { timestamp, .. }
| NetEvent::TransitionClockRestarted { timestamp, .. }
| NetEvent::TransitionStarted { timestamp, .. }
| NetEvent::TransitionCompleted { timestamp, .. }
| NetEvent::TransitionFailed { timestamp, .. }
| NetEvent::TransitionTimedOut { timestamp, .. }
| NetEvent::ActionTimedOut { timestamp, .. }
| NetEvent::TokenAdded { timestamp, .. }
| NetEvent::TokenRemoved { timestamp, .. }
| NetEvent::LogMessage { timestamp, .. }
| NetEvent::MarkingSnapshot { timestamp, .. } => *timestamp,
}
}
pub fn place_name(&self) -> Option<&str> {
match self {
NetEvent::TokenAdded { place_name, .. }
| NetEvent::TokenRemoved { place_name, .. } => Some(place_name),
_ => None,
}
}
pub fn instance_prefix(&self) -> Option<&str> {
let name = self.transition_name().or_else(|| self.place_name())?;
instance_prefix_of(name)
}
pub fn transition_name(&self) -> Option<&str> {
match self {
NetEvent::TransitionEnabled {
transition_name, ..
}
| NetEvent::TransitionClockRestarted {
transition_name, ..
}
| NetEvent::TransitionStarted {
transition_name, ..
}
| NetEvent::TransitionCompleted {
transition_name, ..
}
| NetEvent::TransitionFailed {
transition_name, ..
}
| NetEvent::TransitionTimedOut {
transition_name, ..
}
| NetEvent::ActionTimedOut {
transition_name, ..
}
| NetEvent::LogMessage {
transition_name, ..
} => Some(transition_name),
_ => None,
}
}
pub fn is_failure(&self) -> bool {
matches!(
self,
NetEvent::TransitionFailed { .. }
| NetEvent::TransitionTimedOut { .. }
| NetEvent::ActionTimedOut { .. }
)
}
pub fn has_error_signal(&self) -> bool {
match self {
NetEvent::TransitionFailed { .. }
| NetEvent::TransitionTimedOut { .. }
| NetEvent::ActionTimedOut { .. } => true,
NetEvent::LogMessage { level, .. } => level.eq_ignore_ascii_case("ERROR"),
_ => false,
}
}
}