1use ntex_bytes::Bytes;
2use ntex_error::Error;
3use ntex_http::HeaderMap;
4
5use crate::error::{OperationError, StreamError};
6use crate::frame::{PseudoHeaders, StreamId};
7use crate::stream::{Capacity, StreamRef};
8
9#[derive(Debug)]
10pub struct Message {
11 pub stream: StreamRef,
12 pub kind: MessageKind,
13}
14
15#[derive(Debug)]
16pub enum MessageKind {
17 Headers {
18 pseudo: PseudoHeaders,
19 headers: HeaderMap,
20 eof: bool,
21 },
22 Data(Bytes, Capacity),
23 Eof(StreamEof),
24 Disconnect(Error<OperationError>),
25}
26
27#[derive(Debug, Clone)]
28pub enum StreamEof {
29 Data(Bytes),
30 Trailers(HeaderMap),
31 Error(Error<StreamError>),
32}
33
34impl Message {
35 pub(crate) fn new(
36 pseudo: PseudoHeaders,
37 headers: HeaderMap,
38 eof: bool,
39 stream: &StreamRef,
40 ) -> Self {
41 Message {
42 stream: stream.clone(),
43 kind: MessageKind::Headers {
44 pseudo,
45 headers,
46 eof,
47 },
48 }
49 }
50
51 pub(crate) fn data(data: Bytes, capacity: Capacity, stream: &StreamRef) -> Self {
52 Message {
53 stream: stream.clone(),
54 kind: MessageKind::Data(data, capacity),
55 }
56 }
57
58 pub(crate) fn eof_data(data: Bytes, stream: &StreamRef) -> Self {
59 Message {
60 stream: stream.clone(),
61 kind: MessageKind::Eof(StreamEof::Data(data)),
62 }
63 }
64
65 pub(crate) fn trailers(hdrs: HeaderMap, stream: &StreamRef) -> Self {
66 Message {
67 stream: stream.clone(),
68 kind: MessageKind::Eof(StreamEof::Trailers(hdrs)),
69 }
70 }
71
72 pub(crate) fn error(err: Error<StreamError>, stream: &StreamRef) -> Self {
73 Message {
74 stream: stream.clone(),
75 kind: MessageKind::Eof(StreamEof::Error(err)),
76 }
77 }
78
79 pub(crate) fn disconnect(err: Error<OperationError>, stream: StreamRef) -> Self {
80 Message {
81 stream,
82 kind: MessageKind::Disconnect(err),
83 }
84 }
85
86 #[inline]
87 pub fn id(&self) -> StreamId {
88 self.stream.id()
89 }
90
91 #[inline]
92 pub fn kind(&self) -> &MessageKind {
93 &self.kind
94 }
95
96 #[inline]
97 pub fn stream(&self) -> &StreamRef {
98 &self.stream
99 }
100}