conversation_api/execution/
facade.rs1use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7use crate::execution::{ActionId, ExternalError, InvocationContext, OperationId};
8
9#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
11#[serde(deny_unknown_fields)]
12pub struct FacadeRequest {
13 pub operation_id: OperationId,
15 pub target: String,
17 pub input: Value,
19}
20
21pub use crate::{InteractionCard, InteractionKind, InteractionTone};
22
23#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
25#[serde(deny_unknown_fields)]
26pub struct PreparedAction {
27 pub action_id: ActionId,
29 pub operation_id: OperationId,
31 pub card: InteractionCard,
33 #[serde(default)]
35 pub payload: Value,
36 pub revision: u64,
38}
39
40#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
42#[serde(deny_unknown_fields)]
43pub struct FacadeResult {
44 pub value: Value,
46 #[serde(default, skip_serializing_if = "Option::is_none")]
48 pub context_invalidation: Option<crate::execution::ContextInvalidation>,
49}
50
51#[async_trait]
56pub trait AppFacade: Send + Sync {
57 async fn invoke(
59 &self,
60 context: &InvocationContext,
61 request: FacadeRequest,
62 ) -> Result<FacadeResult, ExternalError>;
63
64 async fn prepare(
66 &self,
67 context: &InvocationContext,
68 request: FacadeRequest,
69 ) -> Result<PreparedAction, ExternalError>;
70
71 async fn commit(
73 &self,
74 context: &InvocationContext,
75 action: PreparedAction,
76 ) -> Result<FacadeResult, ExternalError>;
77
78 async fn reject(
80 &self,
81 context: &InvocationContext,
82 action: PreparedAction,
83 ) -> Result<(), ExternalError>;
84}