treehouse/crates/treehouse/src/tree/attributes.rs

63 lines
2 KiB
Rust
Raw Normal View History

2024-02-07 15:33:46 +01:00
use serde::{Deserialize, Serialize};
2023-08-20 12:15:48 +02:00
2024-01-18 22:46:57 +01:00
/// Top-level `%%` root attributes.
2024-02-07 15:33:46 +01:00
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
2024-01-18 22:46:57 +01:00
pub struct RootAttributes {
/// Title of the generated .html page.
///
/// The page's tree path is used if empty.
#[serde(default)]
pub title: String,
2024-02-07 15:33:46 +01:00
/// Summary of the generated .html page.
#[serde(default)]
pub description: Option<String>,
/// ID of picture attached to the page, to be used as a thumbnail.
#[serde(default)]
pub thumbnail: Option<String>,
2024-01-18 22:46:57 +01:00
}
2023-08-20 12:15:48 +02:00
/// Branch attributes.
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize)]
pub struct Attributes {
/// Unique identifier of the branch.
///
/// Note that this must be unique to the _entire_ site, not just a single tree.
/// This is because trees may be embedded within each other using [`Content::Link`].
#[serde(default)]
pub id: String,
/// Controls how the block should be presented.
#[serde(default)]
pub content: Content,
2023-08-22 22:32:40 +02:00
/// Do not persist the branch in localStorage.
#[serde(default)]
pub do_not_persist: bool,
2023-08-20 12:15:48 +02:00
}
/// Controls for block content presentation.
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Content {
/// Children are stored inline in the block. Nothing special happens.
#[default]
Inline,
/// Link to another tree.
///
/// When JavaScript is enabled, the tree's roots will be embedded inline into the branch and
/// loaded lazily.
///
/// Without JavaScript, the tree will be linked with an `<a>` element.
///
/// The string provided as an argument is relative to the `content` root and should not contain
/// any file extensions. For example, to link to `content/my-article.tree`,
/// use `content.link = "my-article"`.
///
/// Note that `Link` branches must not contain any children. If a `Link` branch does contain
/// children, an `attribute`-type error is raised.
Link(String),
}