我正在开发一个客户端服务器应用程序,在该应用程序中,我使用 rust crate prost 将消息作为协议缓冲区发送到每个协议缓冲区。目前我有一个通用send_message
函数,可以采用任何实现该prost::Message
特征的结构。我正在尝试创建一个类似的函数来读取实现prost::Message
. 我认为问题在于,decode
实现类型的方法prost::Message
是关联函数而不是实例方法。实现的对象的实际实例prost::Message
是在函数中创建的。
我想知道是否有一种方法可以制作一个通用read_message
函数,该函数可以接受任何实现prost::Message
并在该类型上使用关联函数decode
的类型。
这是我目前的send_message
功能:
pub fn send_message<M>(message: M, stream: &mut TcpStream) -> io::Result<()>
where
M: Message,
{
let length = message.encoded_len() as i32;
let mut buf: Vec<u8> = Vec::with_capacity(length as usize);
message.encode(&mut buf)?;
stream.write_all(&length.to_le_bytes())?;
stream.write_all(&buf)?;
Ok(())
}
现在我有两个read_TYPE_message
功能:
pub fn read_response_message(stream: &mut TcpStream) -> io::Result<message::Response> {
let mut len_buf = [0u8; 4];
stream.read_exact(&mut len_buf)?;
let len = i32::from_le_bytes(len_buf);
println!("Incoming message length: {}", len);
let mut buf = vec![0u8; len as usize];
stream.read_exact(&mut buf)?;
let response = message::Response::decode(&mut buf.as_slice())?;
Ok(response)
}
fn read_request_message(stream: &mut TcpStream) -> io::Result<message::Request> {
let mut len_buf = [0u8; 4];
stream.read_exact(&mut len_buf)?;
let len = i32::from_le_bytes(len_buf);
println!("Incoming message length: {}", len);
let mut buf = vec![0u8; len as usize];
stream.read_exact(&mut buf)?;
let user_input = message::Request::decode(&mut buf.as_slice())?;
Ok(user_input)
}
当我尝试以下操作时:
fn read_message<M: Message>(msg: M, stream: &mut TcpStream) -> io::Result<M> {
let mut len_buf = [0u8; 4];
stream.read_exact(&mut len_buf)?;
let len = i32::from_le_bytes(len_buf);
println!("Incoming message length: {}", len);
let mut buf = vec![0u8; len as usize];
stream.read_exact(&mut buf)?;
let pb_msg = msg::decode(&mut buf.as_slice())?;
Ok(pb_msg)
}
我得到错误
failed to resolve: use of undeclared crate or module `msg` use of undeclared crate or module `msg`
我希望能够使用这样的功能:
let input = read_message(message::Request, &mut stream)?;
let input = read_message(message::Response, &mut stream)?;