haven 0.1.1

Actix + React + Vite integration for server-rendered applications
Documentation
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())
}