cosmic_space/wave/core/
http2.rs

1use 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}