Skip to main content

ntex_grpc/server/
mod.rs

1use std::ops;
2
3use ntex_bytes::{ByteString, Bytes};
4use ntex_http::{HeaderMap, HeaderName, HeaderValue};
5
6mod error;
7mod service;
8
9pub use self::error::{MethodResult, ServerError};
10pub use self::service::{GrpcServer, GrpcService};
11pub use crate::GrpcStatus;
12
13#[derive(Debug)]
14pub struct ServerRequest {
15    pub name: ByteString,
16    pub payload: Bytes,
17    pub headers: HeaderMap,
18}
19
20#[derive(Debug)]
21pub struct ServerResponse {
22    pub payload: Bytes,
23    pub headers: Vec<(HeaderName, HeaderValue)>,
24}
25
26impl ServerResponse {
27    #[inline]
28    pub fn new(payload: Bytes) -> ServerResponse {
29        ServerResponse::with_headers(payload, Vec::new())
30    }
31
32    #[inline]
33    pub fn with_headers(
34        payload: Bytes,
35        headers: Vec<(HeaderName, HeaderValue)>,
36    ) -> ServerResponse {
37        ServerResponse { payload, headers }
38    }
39}
40
41pub trait FromRequest<T> {
42    fn from(input: Request<T>) -> Self;
43}
44
45pub struct Request<T> {
46    pub name: ByteString,
47    pub headers: HeaderMap,
48    pub message: T,
49}
50
51impl<T> FromRequest<T> for T {
52    #[inline]
53    fn from(input: Request<T>) -> T {
54        input.message
55    }
56}
57
58impl<T> FromRequest<T> for Request<T> {
59    #[inline]
60    fn from(input: Request<T>) -> Request<T> {
61        input
62    }
63}
64
65impl<T> Request<T> {
66    pub fn into_inner(self) -> T {
67        self.message
68    }
69}
70
71impl<T> ops::Deref for Request<T> {
72    type Target = T;
73
74    #[inline]
75    fn deref(&self) -> &T {
76        &self.message
77    }
78}
79
80impl<T> ops::DerefMut for Request<T> {
81    #[inline]
82    fn deref_mut(&mut self) -> &mut T {
83        &mut self.message
84    }
85}
86
87pub struct Response<T> {
88    pub message: T,
89    pub headers: Vec<(HeaderName, HeaderValue)>,
90}
91
92impl<T> Response<T> {
93    pub fn new(message: T) -> Self {
94        Self {
95            message,
96            headers: Vec::new(),
97        }
98    }
99}
100
101impl<T> From<T> for Response<T> {
102    fn from(message: T) -> Self {
103        Response {
104            message,
105            headers: Vec::new(),
106        }
107    }
108}