use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "tag", rename_all = "lowercase")]
pub enum HeadTag {
Meta {
#[serde(default)]
name: Option<String>,
#[serde(default)]
property: Option<String>,
content: String,
},
Link {
rel: String,
href: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PageData {
pub component: String,
#[serde(default)]
pub props: Value,
#[serde(default = "default_url")]
pub url: String,
#[serde(default = "default_version")]
pub version: String,
#[serde(default = "default_locale")]
pub locale: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct PageMeta {
#[serde(default)]
pub title: Option<String>,
#[serde(default = "default_resources")]
pub resources: Value,
#[serde(default)]
pub head: Vec<HeadTag>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RenderRequest {
pub id: String,
pub page: PageData,
#[serde(default)]
pub meta: PageMeta,
#[serde(default = "default_errors")]
pub errors: Value,
}
pub type PageEnvelope = RenderRequest;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PartialPageEnvelope {
pub component: String,
#[serde(default)]
pub props: Map<String, Value>,
#[serde(default)]
pub resources: Map<String, Value>,
#[serde(default)]
pub errors: Option<Map<String, Value>>,
pub url: String,
pub version: String,
pub locale: String,
#[serde(default)]
pub title: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RenderResponse {
pub html: String,
#[serde(default)]
pub head: Vec<String>,
#[serde(default)]
pub status: Option<u16>,
}
fn default_url() -> String {
"/".into()
}
fn default_version() -> String {
"dev".into()
}
fn default_locale() -> String {
"en".into()
}
fn default_resources() -> Value {
Value::Object(Default::default())
}
fn default_errors() -> Value {
Value::Object(Default::default())
}