use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use utoipa::ToSchema;
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct AgentRegistrationRequest {
pub agent_type: String,
pub agent_id: String,
pub agent_data_port: u16,
pub agent_version: String,
pub controller_version: String,
pub capabilities: HashMap<String, serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_ip: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chosen_transport: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct TransportConfig {
pub transport_type: String,
pub enabled: bool,
pub ports: HashMap<String, u16>,
pub host: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct AgentRegistrationResponse {
pub status: String,
pub message: String,
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub transport: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rates: Option<HashMap<String, HashMap<String, f64>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transports: Option<Vec<TransportConfig>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recommended_transport: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shm_paths: Option<HashMap<String, String>>,
pub cortical_areas: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct HeartbeatRequest {
pub agent_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct HeartbeatResponse {
pub message: String,
pub success: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct AgentListResponse {
#[serde(flatten)]
pub agent_ids: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct AgentPropertiesResponse {
pub agent_name: String,
pub agent_type: String,
pub agent_ip: String,
pub agent_data_port: u16,
pub agent_router_address: String,
pub agent_version: String,
pub controller_version: String,
pub capabilities: HashMap<String, serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chosen_transport: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct AgentCapabilitiesSummary {
pub agent_name: String,
pub capabilities: HashMap<String, serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub device_registrations: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct AgentCapabilitiesAllQuery {
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub capability: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_device_registrations: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct AgentDeregistrationRequest {
pub agent_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct SuccessResponse {
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub success: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct ManualStimulationRequest {
pub stimulation_payload: HashMap<String, Vec<Vec<i32>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mode: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct ManualStimulationResponse {
pub success: bool,
pub total_coordinates: usize,
pub requested_coordinates: usize,
pub matched_coordinates: usize,
pub unique_neuron_ids: usize,
pub mode: String,
pub successful_areas: usize,
pub failed_areas: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DeviceRegistrationExportResponse {
pub device_registrations: serde_json::Value,
pub agent_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DeviceRegistrationImportRequest {
pub device_registrations: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DeviceRegistrationImportResponse {
pub success: bool,
pub message: String,
pub agent_id: String,
}