0

我正在开发一个客户端服务器应用程序,在该应用程序中,我使用 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)?;
4

0 回答 0