1use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8use utoipa::ToSchema;
9
10#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
12pub struct AgentRegistrationRequest {
13 pub agent_type: String,
15
16 pub agent_id: String,
18
19 pub agent_data_port: u16,
21
22 pub agent_version: String,
24
25 pub controller_version: String,
27
28 pub capabilities: HashMap<String, serde_json::Value>,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub agent_ip: Option<String>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub metadata: Option<HashMap<String, serde_json::Value>>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub chosen_transport: Option<String>,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
46pub struct TransportConfig {
47 pub transport_type: String,
48 pub enabled: bool,
49 pub ports: HashMap<String, u16>,
50 pub host: String,
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
55pub struct AgentRegistrationResponse {
56 pub status: String,
57 pub message: String,
58 pub success: bool,
59
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub transport: Option<HashMap<String, serde_json::Value>>,
62
63 #[serde(skip_serializing_if = "Option::is_none")]
64 pub rates: Option<HashMap<String, HashMap<String, f64>>>,
65
66 #[serde(skip_serializing_if = "Option::is_none")]
68 pub transports: Option<Vec<TransportConfig>>,
69
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub recommended_transport: Option<String>,
72
73 #[serde(skip_serializing_if = "Option::is_none")]
74 pub zmq_ports: Option<HashMap<String, u16>>,
75
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub shm_paths: Option<HashMap<String, String>>,
78
79 pub cortical_areas: serde_json::Value,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
85pub struct HeartbeatRequest {
86 pub agent_id: String,
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
91pub struct HeartbeatResponse {
92 pub message: String,
93 pub success: bool,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
98pub struct AgentListResponse {
99 #[serde(flatten)]
101 pub agent_ids: Vec<String>,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
106pub struct AgentPropertiesResponse {
107 pub agent_type: String,
108 pub agent_ip: String,
109 pub agent_data_port: u16,
110 pub agent_router_address: String,
111 pub agent_version: String,
112 pub controller_version: String,
113 pub capabilities: HashMap<String, serde_json::Value>,
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub chosen_transport: Option<String>,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
120pub struct AgentDeregistrationRequest {
121 pub agent_id: String,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
126pub struct SuccessResponse {
127 pub message: String,
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub success: Option<bool>,
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
134pub struct ManualStimulationRequest {
135 pub stimulation_payload: HashMap<String, Vec<Vec<i32>>>,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
141pub struct ManualStimulationResponse {
142 pub success: bool,
143 pub total_coordinates: usize,
144 pub successful_areas: usize,
145 pub failed_areas: Vec<String>,
146 #[serde(skip_serializing_if = "Option::is_none")]
147 pub error: Option<String>,
148}
149
150#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
156pub struct DeviceRegistrationExportResponse {
157 pub device_registrations: serde_json::Value,
160 pub agent_id: String,
162}
163
164#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
169pub struct DeviceRegistrationImportRequest {
170 pub device_registrations: serde_json::Value,
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
177pub struct DeviceRegistrationImportResponse {
178 pub success: bool,
179 pub message: String,
180 pub agent_id: String,
181}