Skip to main content

haven/
protocol.rs

1use serde::{Deserialize, Serialize};
2use serde_json::{Map, Value};
3
4#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
5#[serde(tag = "tag", rename_all = "lowercase")]
6pub enum HeadTag {
7    Meta {
8        #[serde(default)]
9        name: Option<String>,
10        #[serde(default)]
11        property: Option<String>,
12        content: String,
13    },
14    Link {
15        rel: String,
16        href: String,
17    },
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
21pub struct PageData {
22    pub component: String,
23    #[serde(default)]
24    pub props: Value,
25    #[serde(default = "default_url")]
26    pub url: String,
27    #[serde(default = "default_version")]
28    pub version: String,
29    #[serde(default = "default_locale")]
30    pub locale: String,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
34pub struct PageMeta {
35    #[serde(default)]
36    pub title: Option<String>,
37    #[serde(default = "default_resources")]
38    pub resources: Value,
39    #[serde(default)]
40    pub head: Vec<HeadTag>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
44pub struct RenderRequest {
45    pub id: String,
46    pub page: PageData,
47    #[serde(default)]
48    pub meta: PageMeta,
49    #[serde(default = "default_errors")]
50    pub errors: Value,
51}
52
53pub type PageEnvelope = RenderRequest;
54
55#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
56pub struct PartialPageEnvelope {
57    pub component: String,
58    #[serde(default)]
59    pub props: Map<String, Value>,
60    #[serde(default)]
61    pub resources: Map<String, Value>,
62    #[serde(default)]
63    pub errors: Option<Map<String, Value>>,
64    pub url: String,
65    pub version: String,
66    pub locale: String,
67    #[serde(default)]
68    pub title: Option<String>,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
72pub struct RenderResponse {
73    pub html: String,
74    #[serde(default)]
75    pub head: Vec<String>,
76    #[serde(default)]
77    pub status: Option<u16>,
78}
79
80fn default_url() -> String {
81    "/".into()
82}
83
84fn default_version() -> String {
85    "dev".into()
86}
87
88fn default_locale() -> String {
89    "en".into()
90}
91
92fn default_resources() -> Value {
93    Value::Object(Default::default())
94}
95
96fn default_errors() -> Value {
97    Value::Object(Default::default())
98}