use std::collections::BTreeMap;
use anyhow::Result;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BrandSpec {
#[serde(default)]
pub name: String,
#[serde(default)]
pub auto_layout: AutoLayout,
#[serde(default)]
pub palette: BTreeMap<String, String>,
#[serde(default)]
pub fonts: BTreeMap<String, String>,
}
impl BrandSpec {
pub fn from_toml(s: &str) -> Result<Self> {
Ok(toml::from_str(s)?)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AutoLayout {
pub first: Option<String>,
pub last: Option<String>,
pub default: String,
#[serde(default)]
pub rules: Vec<AutoRule>,
}
impl Default for AutoLayout {
fn default() -> Self {
Self {
first: Some("hero".to_string()),
last: Some("thanks".to_string()),
default: "content".to_string(),
rules: vec![
AutoRule { when: ShapePredicate::SingleH1Only, class: "section-divider".to_string() },
AutoRule { when: ShapePredicate::SingleImageOnly, class: "image-full".to_string() },
AutoRule { when: ShapePredicate::SingleBlockquoteOnly, class: "callout".to_string() },
],
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AutoRule {
pub when: ShapePredicate,
pub class: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ShapePredicate {
Empty,
SingleH1Only,
SingleImageOnly,
SingleBlockquoteOnly,
}