Skip to main content

aver_rt/
service_types.rs

1use crate::{AverDisplay, AverList, AverMap, AverStr};
2
3#[derive(Clone, Debug, PartialEq, Eq, Hash, Ord, PartialOrd)]
4pub struct TerminalSize {
5    pub width: i64,
6    pub height: i64,
7}
8
9impl AverDisplay for TerminalSize {
10    fn aver_display(&self) -> String {
11        format!(
12            "Terminal.Size(width: {}, height: {})",
13            self.width.aver_display_inner(),
14            self.height.aver_display_inner()
15        )
16    }
17
18    fn aver_display_inner(&self) -> String {
19        self.aver_display()
20    }
21}
22
23#[derive(Clone, Debug, PartialEq, Eq, Hash, Ord, PartialOrd)]
24pub struct Header {
25    pub name: AverStr,
26    pub value: AverStr,
27}
28
29impl Header {
30    /// Convenience constructor from owned Strings (used by runtime internals).
31    pub fn from_strings(name: String, value: String) -> Self {
32        Self {
33            name: AverStr::from(name),
34            value: AverStr::from(value),
35        }
36    }
37}
38
39impl AverDisplay for Header {
40    fn aver_display(&self) -> String {
41        format!(
42            "Header(name: {}, value: {})",
43            self.name.aver_display_inner(),
44            self.value.aver_display_inner()
45        )
46    }
47
48    fn aver_display_inner(&self) -> String {
49        self.aver_display()
50    }
51}
52
53/// Multi-value HTTP headers, modelled as `Map<String, List<String>>` —
54/// matches RFC 9110 (same-name fields) and RFC 6265 (multiple
55/// Set-Cookie). Keys are case-insensitive by convention; runtime
56/// lowercases incoming names. Mirrors Go `net/http.Header`.
57pub type HttpHeaders = AverMap<AverStr, AverList<AverStr>>;
58
59#[derive(Clone, Debug, PartialEq)]
60pub struct HttpResponse {
61    pub status: i64,
62    pub body: AverStr,
63    pub headers: HttpHeaders,
64}
65
66impl AverDisplay for HttpResponse {
67    fn aver_display(&self) -> String {
68        format!(
69            "HttpResponse(status: {}, body: {}, headers: {})",
70            self.status.aver_display_inner(),
71            self.body.aver_display_inner(),
72            self.headers.aver_display_inner()
73        )
74    }
75
76    fn aver_display_inner(&self) -> String {
77        self.aver_display()
78    }
79}
80
81#[derive(Clone, Debug, PartialEq)]
82pub struct HttpRequest {
83    pub method: AverStr,
84    pub path: AverStr,
85    pub body: AverStr,
86    pub headers: HttpHeaders,
87}
88
89impl AverDisplay for HttpRequest {
90    fn aver_display(&self) -> String {
91        format!(
92            "HttpRequest(method: {}, path: {}, body: {}, headers: {})",
93            self.method.aver_display_inner(),
94            self.path.aver_display_inner(),
95            self.body.aver_display_inner(),
96            self.headers.aver_display_inner()
97        )
98    }
99
100    fn aver_display_inner(&self) -> String {
101        self.aver_display()
102    }
103}
104
105#[derive(Clone, Debug, PartialEq, Eq, Hash, Ord, PartialOrd)]
106pub struct TcpConnection {
107    pub id: AverStr,
108    pub host: AverStr,
109    pub port: i64,
110}
111
112impl TcpConnection {
113    pub fn from_parts(id: String, host: String, port: i64) -> Self {
114        Self {
115            id: AverStr::from(id),
116            host: AverStr::from(host),
117            port,
118        }
119    }
120}
121
122impl AverDisplay for TcpConnection {
123    fn aver_display(&self) -> String {
124        format!(
125            "Tcp.Connection(id: {}, host: {}, port: {})",
126            self.id.aver_display_inner(),
127            self.host.aver_display_inner(),
128            self.port.aver_display_inner()
129        )
130    }
131
132    fn aver_display_inner(&self) -> String {
133        self.aver_display()
134    }
135}