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}