Skip to main content

co_primitives/types/
action.rs

1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 1io BRANDGUARDIAN GmbH
3
4use crate::{Date, Did};
5use ipld_core::{
6	ipld::Ipld,
7	serde::{from_ipld, to_ipld},
8};
9use serde::{de::DeserializeOwned, Deserialize, Serialize};
10
11#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
12pub struct ReducerAction<T> {
13	/// Sender.
14	#[serde(rename = "f")]
15	pub from: Did,
16
17	/// Time when the event occured.
18	///
19	/// Note: The time from the dispatching device is used.
20	#[serde(rename = "t")]
21	pub time: Date,
22
23	/// COre affected by this action.
24	#[serde(rename = "c")]
25	pub core: String,
26
27	/// Action payload.
28	#[serde(rename = "p")]
29	pub payload: T,
30}
31impl ReducerAction<Ipld> {
32	pub fn set_payload<T: Serialize>(&mut self, value: &T) -> Result<(), String> {
33		self.payload = to_ipld(value).map_err(|e| e.to_string())?;
34		Ok(())
35	}
36
37	pub fn get_payload<T: DeserializeOwned>(&self) -> Result<T, String> {
38		from_ipld(self.payload.clone()).map_err(|e| e.to_string())
39	}
40}