runifold_effect/
record.rs1use runifold_core::{EffectRequest, RunError};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
7#[serde(tag = "state", rename_all = "snake_case")]
8#[non_exhaustive]
9pub enum EffectStatus {
10 Prepared,
12 Started,
14 Completed {
16 output: Value,
18 },
19 Failed {
21 error: RunError,
23 },
24}
25
26#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
28pub struct EffectRecord {
29 pub revision: u64,
31 pub request: EffectRequest,
33 pub status: EffectStatus,
35}
36
37impl EffectRecord {
38 pub const fn prepared(request: EffectRequest) -> Self {
40 Self {
41 revision: 0,
42 request,
43 status: EffectStatus::Prepared,
44 }
45 }
46
47 pub(crate) fn next(&self, status: EffectStatus) -> Result<Self, crate::EffectExecutorError> {
49 Ok(Self {
50 revision: self.revision.checked_add(1).ok_or_else(|| {
51 crate::EffectExecutorError::new(
52 crate::EffectExecutorErrorKind::Store,
53 "effect revision overflow",
54 )
55 })?,
56 request: self.request.clone(),
57 status,
58 })
59 }
60}