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
use crate::requests::common::wire_header_1_0::WireHeader as Raw;
use crate::requests::{BodyType, Opcode, ProviderID, ResponseStatus, Result};
use num::FromPrimitive;
use std::convert::TryFrom;
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct ResponseHeader {
pub provider: ProviderID,
pub session: u64,
pub content_type: BodyType,
pub opcode: Opcode,
pub status: ResponseStatus,
}
impl ResponseHeader {
pub(crate) fn new() -> ResponseHeader {
ResponseHeader {
provider: ProviderID::Core,
session: 0,
content_type: BodyType::Protobuf,
opcode: Opcode::Ping,
status: ResponseStatus::Success,
}
}
}
impl TryFrom<Raw> for ResponseHeader {
type Error = ResponseStatus;
fn try_from(header: Raw) -> Result<ResponseHeader> {
let provider: ProviderID = match FromPrimitive::from_u8(header.provider) {
Some(provider_id) => provider_id,
None => return Err(ResponseStatus::ProviderDoesNotExist),
};
let content_type: BodyType = match FromPrimitive::from_u8(header.content_type) {
Some(content_type) => content_type,
None => return Err(ResponseStatus::ContentTypeNotSupported),
};
let opcode: Opcode = match FromPrimitive::from_u32(header.opcode) {
Some(opcode) => opcode,
None => return Err(ResponseStatus::OpcodeDoesNotExist),
};
let status: ResponseStatus = match FromPrimitive::from_u16(header.status) {
Some(status) => status,
None => return Err(ResponseStatus::InvalidEncoding),
};
Ok(ResponseHeader {
provider,
session: header.session,
content_type,
opcode,
status,
})
}
}
impl From<ResponseHeader> for Raw {
fn from(header: ResponseHeader) -> Self {
Raw {
flags: 0,
provider: header.provider as u8,
session: header.session,
content_type: header.content_type as u8,
accept_type: 0,
auth_type: 0,
auth_len: 0,
body_len: 0,
opcode: header.opcode as u32,
status: header.status as u16,
reserved1: 0,
reserved2: 0,
}
}
}