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"] }
|
tokio = { version = "1.9.0", features = ["full"] }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
|
||||||
|
prost.workspace = true
|
||||||
protocol = { path = '../protocol' }
|
protocol = { path = '../protocol' }
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
pub mod messages;
|
pub mod messages;
|
||||||
pub mod models;
|
pub mod models;
|
||||||
|
pub mod networking;
|
||||||
pub mod prelude;
|
pub mod prelude;
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
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 {
|
message NetworkServerMessage {
|
||||||
oneof message {
|
oneof message {
|
||||||
Request request = 1;
|
Request request = 1;
|
||||||
|
Info got_info = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
message Request {}
|
message Request {
|
||||||
|
bool a = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message Info {
|
message Info {
|
||||||
string server_name = 1;
|
string server_name = 1;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue