moved protocol crate to foundation, created helper functions for encoding and decoding
This commit is contained in:
parent
603c6f7194
commit
fc402438f8
|
|
@ -25,4 +25,5 @@ uuid = {version = "1.1.2", features = ["serde", "v4"]}
|
|||
tokio = { version = "1.9.0", features = ["full"] }
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
|
||||
prost.workspace = true
|
||||
protocol = { path = '../protocol' }
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
pub mod messages;
|
||||
pub mod models;
|
||||
pub mod networking;
|
||||
pub mod prelude;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,75 @@
|
|||
use std::io::{self, ErrorKind};
|
||||
|
||||
use prost::{
|
||||
bytes::{BufMut, Bytes, BytesMut},
|
||||
Message,
|
||||
};
|
||||
use tokio::{
|
||||
io::{AsyncReadExt, AsyncWriteExt},
|
||||
net::TcpStream,
|
||||
};
|
||||
|
||||
pub async fn write_message<T>(
|
||||
stream: &mut TcpStream,
|
||||
message: T,
|
||||
) -> io::Result<()>
|
||||
where
|
||||
T: Message + Default,
|
||||
{
|
||||
let message = encode_message::<T>(&message)?;
|
||||
stream.write_all(&message).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn encode_message<T>(msg: &T) -> io::Result<Bytes>
|
||||
where
|
||||
T: Message,
|
||||
{
|
||||
let length = msg.encoded_len();
|
||||
let mut buffer = BytesMut::with_capacity(4 + length);
|
||||
buffer.put_u32(length as u32);
|
||||
let encode_result = msg.encode(&mut buffer);
|
||||
if let Err(err) = encode_result {
|
||||
return Err(io::Error::new(
|
||||
ErrorKind::InvalidInput,
|
||||
format!("message encoding failed: {:?}", err),
|
||||
));
|
||||
}
|
||||
|
||||
Ok(buffer.into())
|
||||
}
|
||||
|
||||
pub async fn read_message<T>(stream: &mut TcpStream) -> io::Result<T>
|
||||
where
|
||||
T: Message + Default,
|
||||
{
|
||||
let size = stream.read_u32().await?;
|
||||
println!("need to read: {}", size);
|
||||
let mut buffer = BytesMut::with_capacity(size as usize);
|
||||
unsafe { buffer.set_len(size as usize) };
|
||||
|
||||
println!("buffer size: {}", buffer.len());
|
||||
|
||||
stream.read_exact(&mut buffer).await?;
|
||||
println!("buffer size after read: {}", buffer.len());
|
||||
println!("buffer content: {:?}", buffer);
|
||||
|
||||
let message = decode_message::<T>(buffer.into())?;
|
||||
println!("decoded message: {:?}", message);
|
||||
|
||||
Ok(message)
|
||||
}
|
||||
|
||||
pub fn decode_message<T>(buffer: Bytes) -> io::Result<T>
|
||||
where
|
||||
T: Message + Default,
|
||||
{
|
||||
let msg_result = T::decode(buffer);
|
||||
match msg_result {
|
||||
Ok(msg) => Ok(msg),
|
||||
Err(err) => Err(io::Error::new(
|
||||
ErrorKind::InvalidInput,
|
||||
format!("message decoding failed: {:?}", err),
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
|
@ -21,10 +21,13 @@ message Connect {
|
|||
message NetworkServerMessage {
|
||||
oneof message {
|
||||
Request request = 1;
|
||||
Info got_info = 2;
|
||||
}
|
||||
}
|
||||
|
||||
message Request {}
|
||||
message Request {
|
||||
bool a = 1;
|
||||
}
|
||||
|
||||
message Info {
|
||||
string server_name = 1;
|
||||
|
|
|
|||
Loading…
Reference in New Issue