63 lines
2.1 KiB
Rust
63 lines
2.1 KiB
Rust
|
// 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<crate::common::protocol::Response> {
|
|||
|
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<T: serde::Serialize>(
|
|||
|
&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<T: for<'a> serde::Deserialize<'a>>(
|
|||
|
&self,
|
|||
|
reader: &mut (impl AsyncReadExt + Unpin),
|
|||
|
) -> Result<T> {
|
|||
|
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)
|
|||
|
}
|
|||
|
}
|