use runifold_core::{EffectRequest, RunError};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(tag = "state", rename_all = "snake_case")]
#[non_exhaustive]
pub enum EffectStatus {
Prepared,
Started,
Completed {
output: Value,
},
Failed {
error: RunError,
},
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct EffectRecord {
pub revision: u64,
pub request: EffectRequest,
pub status: EffectStatus,
}
impl EffectRecord {
pub const fn prepared(request: EffectRequest) -> Self {
Self {
revision: 0,
request,
status: EffectStatus::Prepared,
}
}
pub(crate) fn next(&self, status: EffectStatus) -> Result<Self, crate::EffectExecutorError> {
Ok(Self {
revision: self.revision.checked_add(1).ok_or_else(|| {
crate::EffectExecutorError::new(
crate::EffectExecutorErrorKind::Store,
"effect revision overflow",
)
})?,
request: self.request.clone(),
status,
})
}
}