actrpc-core 0.1.0

Core types and traits for ActRPC.
Documentation
use crate::{
    action::{ActionKind, ActionSpec, ResolvedAction},
    error::ProtocolError,
};
use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResolvedActionRecord {
    pub kind: ActionKind,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub params: Option<Value>,
    pub result: Result<Option<Value>, ProtocolError>,
}

impl<A> TryFrom<ResolvedAction<A>> for ResolvedActionRecord
where
    A: ActionSpec,
    A::Params: Serialize,
    A::Result: Serialize,
{
    type Error = serde_json::Error;

    fn try_from(value: ResolvedAction<A>) -> Result<Self, Self::Error> {
        Ok(Self {
            kind: A::action_kind(),
            params: Some(serde_json::to_value(value.params)?),
            result: match value.result {
                Ok(ok) => Ok(Some(serde_json::to_value(ok)?)),
                Err(err) => Err(err),
            },
        })
    }
}