use std::collections::HashMap;
use std::sync::Arc;
#[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,
},
TokenAdded {
place_name: Arc<str>,
timestamp: u64,
},
TokenRemoved {
place_name: Arc<str>,
timestamp: u64,
},
LogMessage {
transition_name: Arc<str>,
level: String,
message: String,
timestamp: u64,
},
MarkingSnapshot {
marking: HashMap<Arc<str>, usize>,
timestamp: u64,
},
}
impl NetEvent {
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 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,
}
}
}