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}