cosmic_space/wave/core/
http2.rs1use serde::{Deserialize, Serialize};
2
3use crate::err::SpaceErr;
4use crate::loc::Meta;
5use crate::substance::{FormErrs, Substance};
6use crate::util::ValueMatcher;
7use crate::wave::core::{DirectedCore, HeaderMap, Method, ReflectedCore};
8use url::Url;
9
10#[derive(
11 Debug,
12 Clone,
13 Serialize,
14 Deserialize,
15 strum_macros::Display,
16 strum_macros::EnumString,
17 Eq,
18 PartialEq,
19 Hash,
20)]
21pub enum HttpMethod {
22 Options,
23 Get,
24 Post,
25 Put,
26 Delete,
27 Head,
28 Trace,
29 Connect,
30 Patch,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct HttpRequest {
35 pub method: HttpMethod,
36 pub headers: HeaderMap,
37 pub uri: Url,
38 pub body: Substance,
39}
40
41impl HttpRequest {
42 pub fn ok(&self, payload: Substance) -> ReflectedCore {
43 ReflectedCore {
44 headers: Default::default(),
45 status: StatusCode::from_u16(200u16).unwrap(),
46 body: payload,
47 }
48 }
49
50 pub fn fail(&self, error: &str) -> ReflectedCore {
51 let errors = FormErrs::default(error);
52 ReflectedCore {
53 headers: Default::default(),
54 status: StatusCode::from_u16(500u16).unwrap(),
55 body: Substance::FormErrs(errors),
56 }
57 }
58}
59
60impl Into<DirectedCore> for HttpRequest {
61 fn into(self) -> DirectedCore {
62 DirectedCore {
63 headers: self.headers,
64 method: self.method.into(),
65 uri: self.uri,
66 body: self.body,
67 }
68 }
69}
70
71impl TryFrom<DirectedCore> for HttpRequest {
72 type Error = SpaceErr;
73
74 fn try_from(core: DirectedCore) -> Result<Self, Self::Error> {
75 if let Method::Http(method) = core.method {
76 Ok(Self {
77 method: method.into(),
78 headers: core.headers,
79 uri: core.uri,
80 body: core.body,
81 })
82 } else {
83 Err("expected Http".into())
84 }
85 }
86}
87#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, Hash)]
88pub struct StatusCode {
89 pub code: u16,
90}
91
92impl StatusCode {
93 pub fn from_u16(code: u16) -> Result<Self, SpaceErr> {
94 Ok(Self { code })
95 }
96
97 pub fn as_u16(&self) -> u16 {
98 self.code
99 }
100
101 pub fn is_success(&self) -> bool {
102 self.code >= 200 && self.code <= 299
103 }
104}
105
106impl ToString for StatusCode {
107 fn to_string(&self) -> String {
108 self.code.to_string()
109 }
110}
111
112impl Default for StatusCode {
113 fn default() -> Self {
114 StatusCode::from_u16(200).unwrap()
115 }
116}