Skip to main content

actrpc_core/action/
resolved_action_record.rs

1use crate::{
2    action::{ActionKind, ActionSpec, ResolvedAction},
3    error::ProtocolError,
4};
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
9pub struct ResolvedActionRecord {
10    pub kind: ActionKind,
11    #[serde(default, skip_serializing_if = "Option::is_none")]
12    pub params: Option<Value>,
13    pub result: Result<Option<Value>, ProtocolError>,
14}
15
16impl<A> TryFrom<ResolvedAction<A>> for ResolvedActionRecord
17where
18    A: ActionSpec,
19    A::Params: Serialize,
20    A::Result: Serialize,
21{
22    type Error = serde_json::Error;
23
24    fn try_from(value: ResolvedAction<A>) -> Result<Self, Self::Error> {
25        Ok(Self {
26            kind: A::action_kind(),
27            params: Some(serde_json::to_value(value.params)?),
28            result: match value.result {
29                Ok(ok) => Ok(Some(serde_json::to_value(ok)?)),
30                Err(err) => Err(err),
31            },
32        })
33    }
34}