1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use std::ops;

use ntex_bytes::{ByteString, Bytes};
use ntex_http::{HeaderMap, HeaderName, HeaderValue};

mod service;

pub use self::service::{GrpcServer, GrpcService};

#[derive(thiserror::Error, Clone, Debug)]
pub enum ServerError {
    #[error("{0}")]
    Decode(#[from] crate::DecodeError),
    #[error("Service method is not found: {0}")]
    NotFound(ByteString),
    #[error("Service method is not implemented: {0}")]
    NotImplemented(ByteString),
}

#[derive(Debug)]
pub struct ServerRequest {
    pub name: ByteString,
    pub payload: Bytes,
    pub headers: HeaderMap,
}

#[derive(Debug)]
pub struct ServerResponse {
    pub payload: Bytes,
    pub headers: Vec<(HeaderName, HeaderValue)>,
}

impl ServerResponse {
    #[inline]
    pub fn new(payload: Bytes) -> ServerResponse {
        ServerResponse::with_headers(payload, Vec::new())
    }

    #[inline]
    pub fn with_headers(
        payload: Bytes,
        headers: Vec<(HeaderName, HeaderValue)>,
    ) -> ServerResponse {
        ServerResponse { payload, headers }
    }
}

pub trait FromRequest<T> {
    fn from(input: Request<T>) -> Self;
}

pub struct Request<T> {
    pub name: ByteString,
    pub headers: HeaderMap,
    pub message: T,
}

impl<T> FromRequest<T> for T {
    #[inline]
    fn from(input: Request<T>) -> T {
        input.message
    }
}

impl<T> FromRequest<T> for Request<T> {
    #[inline]
    fn from(input: Request<T>) -> Request<T> {
        input
    }
}

impl<T> Request<T> {
    pub fn into_inner(self) -> T {
        self.message
    }
}

impl<T> ops::Deref for Request<T> {
    type Target = T;

    #[inline]
    fn deref(&self) -> &T {
        &self.message
    }
}

impl<T> ops::DerefMut for Request<T> {
    #[inline]
    fn deref_mut(&mut self) -> &mut T {
        &mut self.message
    }
}

pub struct Response<T> {
    pub message: T,
    pub headers: Vec<(HeaderName, HeaderValue)>,
}

impl<T> Response<T> {
    pub fn new(message: T) -> Self {
        Self {
            message,
            headers: Vec::new(),
        }
    }
}

impl<T> From<T> for Response<T> {
    fn from(message: T) -> Self {
        Response {
            message,
            headers: Vec::new(),
        }
    }
}