Skip to main content

a2ui_base/protocol/
client_to_server.rs

1//! A2UI v1.0 Client-to-Server Messages
2//!
3//! Mirrors the JSON Schema `client_to_server.json`.
4
5use std::collections::HashMap;
6
7use serde::{Deserialize, Serialize};
8
9// ---------------------------------------------------------------------------
10// Top-level envelope
11// ---------------------------------------------------------------------------
12
13/// A message sent from the client to the server.
14#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
15pub struct ClientMessage {
16    pub version: String,
17    #[serde(flatten)]
18    pub payload: ClientPayload,
19}
20
21/// The typed payload of a client-to-server message.
22#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
23#[serde(untagged)]
24pub enum ClientPayload {
25    Action(ActionPayload),
26    FunctionResponse(FunctionResponsePayload),
27    Error(ErrorPayload),
28}
29
30// ---------------------------------------------------------------------------
31// action
32// ---------------------------------------------------------------------------
33
34#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
35pub struct ActionPayload {
36    pub action: ActionData,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
40#[serde(rename_all = "camelCase")]
41pub struct ActionData {
42    pub name: String,
43    pub surface_id: String,
44    pub source_component_id: String,
45    pub timestamp: String,
46    pub context: HashMap<String, serde_json::Value>,
47    #[serde(default, skip_serializing_if = "Option::is_none")]
48    pub want_response: Option<bool>,
49    #[serde(default, skip_serializing_if = "Option::is_none")]
50    pub action_id: Option<String>,
51}
52
53// ---------------------------------------------------------------------------
54// functionResponse
55// ---------------------------------------------------------------------------
56
57#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
58pub struct FunctionResponsePayload {
59    pub function_response: FunctionResponseData,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
63pub struct FunctionResponseData {
64    pub function_call_id: String,
65    pub call: String,
66    pub value: serde_json::Value,
67}
68
69// ---------------------------------------------------------------------------
70// error
71// ---------------------------------------------------------------------------
72
73#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
74pub struct ErrorPayload {
75    pub error: ErrorData,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
79pub struct ErrorData {
80    pub code: String,
81    pub message: String,
82    #[serde(default, skip_serializing_if = "Option::is_none")]
83    pub surface_id: Option<String>,
84    #[serde(default, skip_serializing_if = "Option::is_none")]
85    pub function_call_id: Option<String>,
86}