Skip to main content

actrpc_core/action/
requested_action.rs

1use crate::{
2    action::{ActionSpec, RequestedActionRecord},
3    error::ActionCodecError,
4};
5
6/// A request from an interceptor for the orchestrator to consider executing.
7#[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}