use crate::{Date, Did};
use ipld_core::{
ipld::Ipld,
serde::{from_ipld, to_ipld},
};
use serde::{de::DeserializeOwned, Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ReducerAction<T> {
#[serde(rename = "f")]
pub from: Did,
#[serde(rename = "t")]
pub time: Date,
#[serde(rename = "c")]
pub core: String,
#[serde(rename = "p")]
pub payload: T,
}
impl ReducerAction<Ipld> {
pub fn set_payload<T: Serialize>(&mut self, value: &T) -> Result<(), String> {
self.payload = to_ipld(value).map_err(|e| e.to_string())?;
Ok(())
}
pub fn get_payload<T: DeserializeOwned>(&self) -> Result<T, String> {
from_ipld(self.payload.clone()).map_err(|e| e.to_string())
}
}