actrpc_core/action/
requested_action.rs1use crate::{
2 action::{ActionSpec, RequestedActionRecord},
3 error::ActionCodecError,
4};
5
6#[derive(Debug, Clone, PartialEq)]
8pub struct RequestedAction<A: ActionSpec> {
9 pub params: A::Params,
10}
11
12impl<A> RequestedAction<A>
13where
14 A: ActionSpec,
15{
16 fn decode_from_record(value: &RequestedActionRecord) -> Result<Self, ActionCodecError> {
17 let expected = A::action_kind();
18
19 if value.kind != expected {
20 return Err(ActionCodecError::KindMismatch {
21 expected,
22 actual: value.kind.clone(),
23 });
24 }
25
26 let raw_params = value
27 .params
28 .clone()
29 .ok_or_else(|| ActionCodecError::MissingParams {
30 action: value.kind.clone(),
31 })?;
32
33 let params = serde_json::from_value(raw_params).map_err(|source| {
34 ActionCodecError::InvalidParams {
35 action: value.kind.clone(),
36 source,
37 }
38 })?;
39
40 Ok(Self { params })
41 }
42}
43
44impl<A> TryFrom<RequestedActionRecord> for RequestedAction<A>
45where
46 A: ActionSpec,
47{
48 type Error = ActionCodecError;
49
50 fn try_from(value: RequestedActionRecord) -> Result<Self, Self::Error> {
51 Self::decode_from_record(&value)
52 }
53}