Skip to main content

grpc_core/
request.rs

1//! Request messages and their application metadata.
2
3use crate::Metadata;
4
5/// An outbound or decoded request with application metadata.
6#[derive(Clone, Debug, Eq, PartialEq)]
7pub struct Request<T> {
8    metadata: Metadata,
9    message: T,
10}
11
12impl<T> Request<T> {
13    /// Wraps a message with empty metadata.
14    #[must_use]
15    pub fn new(message: T) -> Self {
16        Self::from_parts(Metadata::new(), message)
17    }
18
19    /// Combines application metadata and a message.
20    #[must_use]
21    pub const fn from_parts(metadata: Metadata, message: T) -> Self {
22        Self { metadata, message }
23    }
24
25    /// Borrows the application metadata.
26    #[must_use]
27    pub const fn metadata(&self) -> &Metadata {
28        &self.metadata
29    }
30
31    /// Mutably borrows the application metadata.
32    pub const fn metadata_mut(&mut self) -> &mut Metadata {
33        &mut self.metadata
34    }
35
36    /// Borrows the message.
37    #[must_use]
38    pub const fn get_ref(&self) -> &T {
39        &self.message
40    }
41
42    /// Mutably borrows the message.
43    pub const fn get_mut(&mut self) -> &mut T {
44        &mut self.message
45    }
46
47    /// Consumes the envelope, returning application metadata and the message.
48    #[must_use]
49    pub fn into_parts(self) -> (Metadata, T) {
50        (self.metadata, self.message)
51    }
52
53    /// Transforms the message while preserving application metadata.
54    #[must_use]
55    pub fn map<U>(self, transform: impl FnOnce(T) -> U) -> Request<U> {
56        Request::from_parts(self.metadata, transform(self.message))
57    }
58}