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