Skip to main content

conversation_api/
interaction.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
4#[serde(tag = "type", rename_all = "snake_case")]
5pub enum PreviewValue {
6    Text { text: String },
7    TextList { items: Vec<String> },
8    Number { value: f64 },
9    Bool { value: bool },
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
13#[serde(rename_all = "camelCase")]
14pub struct PreviewDetail {
15    pub label: String,
16    pub value: PreviewValue,
17}
18
19#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
20#[serde(rename_all = "snake_case")]
21pub enum InteractionTone {
22    #[default]
23    Normal,
24    Danger,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
28#[serde(
29    tag = "type",
30    rename_all = "snake_case",
31    rename_all_fields = "camelCase"
32)]
33pub enum ClientTask {
34    InstallIntegrations { integration_ids: Vec<String> },
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
38#[serde(rename_all = "camelCase")]
39pub struct InteractionPreview {
40    pub action_code: String,
41    pub title: String,
42    pub message: String,
43    #[serde(default)]
44    pub tone: InteractionTone,
45    #[serde(default)]
46    pub details: Vec<PreviewDetail>,
47    pub proceed_label: String,
48    pub reject_label: String,
49    #[serde(default, skip_serializing_if = "Option::is_none")]
50    pub client_task: Option<ClientTask>,
51}
52
53#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
54#[serde(rename_all = "snake_case")]
55pub enum InteractionKind {
56    #[default]
57    Approval,
58    UserAction,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
62#[serde(rename_all = "camelCase")]
63pub struct PendingInteractionItem {
64    pub action_id: String,
65    pub kind: InteractionKind,
66    #[serde(default, skip_serializing_if = "Option::is_none")]
67    pub expires_at: Option<String>,
68    pub preview: InteractionPreview,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
72#[serde(rename_all = "camelCase")]
73pub struct PendingInteraction {
74    pub request_id: String,
75    pub batch_id: String,
76    pub title: String,
77    pub message: String,
78    pub items: Vec<PendingInteractionItem>,
79}
80
81#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
82#[serde(rename_all = "snake_case")]
83pub enum InteractionDecisionValue {
84    Approve,
85    Reject,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
89#[serde(rename_all = "camelCase", deny_unknown_fields)]
90pub struct InteractionDecision {
91    pub action_id: String,
92    pub decision: InteractionDecisionValue,
93}