// client.rs //! Клиент для подключения к серверу Falcot //! //! Обеспечивает взаимодействие с сервером через TCP соединение //! с использованием MessagePack для сериализации сообщений. use tokio::io::{AsyncReadExt, AsyncWriteExt}; use crate::common::error::Result; /// Клиент Falcot #[allow(dead_code)] pub struct FalcotClient { address: String, } #[allow(dead_code)] impl FalcotClient { pub fn new(address: &str) -> Self { Self { address: address.to_string(), } } /// Подключение к серверу и выполнение команды pub async fn execute_command(&self, command: crate::common::protocol::Command) -> Result { let mut socket = tokio::net::TcpStream::connect(&self.address).await .map_err(|e| crate::common::error::FalcotError::NetworkError(e.to_string()))?; let (mut reader, mut writer) = socket.split(); // Отправка команды self.send_message(&mut writer, &command).await?; // Получение ответа let response: crate::common::protocol::Response = self.receive_message(&mut reader).await?; Ok(response) } async fn send_message( &self, writer: &mut (impl AsyncWriteExt + Unpin), message: &T, ) -> Result<()> { let bytes = crate::common::protocol::serialize(message)?; writer.write_all(&bytes).await .map_err(|e| crate::common::error::FalcotError::NetworkError(e.to_string()))?; Ok(()) } async fn receive_message serde::Deserialize<'a>>( &self, reader: &mut (impl AsyncReadExt + Unpin), ) -> Result { let mut buffer = Vec::new(); reader.read_to_end(&mut buffer).await .map_err(|e| crate::common::error::FalcotError::NetworkError(e.to_string()))?; crate::common::protocol::deserialize(&buffer) } }