use std::fmt::Display;
use wasmer_config::app::SnapshotTrigger as ConfigSnapshotTrigger;
use super::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum SnapshotTrigger {
Idle,
FirstListen,
FirstEnviron,
FirstStdin,
FirstSigint,
PeriodicInterval,
Sigint,
Sigalrm,
Sigtstp,
Sigstop,
NonDeterministicCall,
Bootstrap,
Transaction,
Explicit,
}
impl SnapshotTrigger {
pub fn only_once(&self) -> bool {
matches!(
self,
Self::FirstListen
| Self::FirstEnviron
| Self::FirstStdin
| Self::FirstSigint
| Self::Explicit
)
}
}
pub const DEFAULT_SNAPSHOT_TRIGGERS: [SnapshotTrigger; 5] = [
SnapshotTrigger::Idle,
SnapshotTrigger::FirstEnviron,
SnapshotTrigger::FirstListen,
SnapshotTrigger::FirstStdin,
SnapshotTrigger::Explicit,
];
impl From<ConfigSnapshotTrigger> for SnapshotTrigger {
fn from(value: ConfigSnapshotTrigger) -> Self {
match value {
ConfigSnapshotTrigger::Bootstrap => Self::Bootstrap,
ConfigSnapshotTrigger::Explicit => Self::Explicit,
ConfigSnapshotTrigger::FirstEnviron => Self::FirstEnviron,
ConfigSnapshotTrigger::FirstListen => Self::FirstListen,
ConfigSnapshotTrigger::FirstSigint => Self::FirstSigint,
ConfigSnapshotTrigger::FirstStdin => Self::FirstStdin,
ConfigSnapshotTrigger::Idle => Self::Idle,
ConfigSnapshotTrigger::NonDeterministicCall => Self::NonDeterministicCall,
ConfigSnapshotTrigger::PeriodicInterval => Self::PeriodicInterval,
ConfigSnapshotTrigger::Sigalrm => Self::Sigalrm,
ConfigSnapshotTrigger::Sigint => Self::Sigint,
ConfigSnapshotTrigger::Sigstop => Self::Sigstop,
ConfigSnapshotTrigger::Sigtstp => Self::Sigtstp,
ConfigSnapshotTrigger::Transaction => Self::Transaction,
}
}
}
impl From<SnapshotTrigger> for ConfigSnapshotTrigger {
fn from(value: SnapshotTrigger) -> Self {
match value {
SnapshotTrigger::Bootstrap => Self::Bootstrap,
SnapshotTrigger::Explicit => Self::Explicit,
SnapshotTrigger::FirstEnviron => Self::FirstEnviron,
SnapshotTrigger::FirstListen => Self::FirstListen,
SnapshotTrigger::FirstSigint => Self::FirstSigint,
SnapshotTrigger::FirstStdin => Self::FirstStdin,
SnapshotTrigger::Idle => Self::Idle,
SnapshotTrigger::NonDeterministicCall => Self::NonDeterministicCall,
SnapshotTrigger::PeriodicInterval => Self::PeriodicInterval,
SnapshotTrigger::Sigalrm => Self::Sigalrm,
SnapshotTrigger::Sigint => Self::Sigint,
SnapshotTrigger::Sigstop => Self::Sigstop,
SnapshotTrigger::Sigtstp => Self::Sigtstp,
SnapshotTrigger::Transaction => Self::Transaction,
}
}
}
impl FromStr for SnapshotTrigger {
type Err = <ConfigSnapshotTrigger as FromStr>::Err;
fn from_str(s: &str) -> Result<Self, Self::Err> {
<ConfigSnapshotTrigger as FromStr>::from_str(s).map(Into::into)
}
}
impl Display for SnapshotTrigger {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
<ConfigSnapshotTrigger as Display>::fmt(&(*self).into(), f)
}
}
impl Serialize for SnapshotTrigger {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
ConfigSnapshotTrigger::from(*self).serialize(serializer)
}
}
impl<'de> Deserialize<'de> for SnapshotTrigger {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
<ConfigSnapshotTrigger as Deserialize>::deserialize(deserializer).map(Into::into)
}
}