feat: cut over rust web main shell

This commit is contained in:
lix-2026
2026-04-29 12:24:44 +08:00
parent 7965c6c107
commit 048fe28a4d
97 changed files with 9396 additions and 1263 deletions
@@ -0,0 +1,307 @@
//! PageAggregate 构建器(Builder 模式)。
//!
//! 使用方法:
//! ```rust,ignore
//! let aggregate = PageAggregate::builder()
//! .document_id("doc_1")
//! .workspace_id("ws_demo")
//! .title("我的页面")
//! .build();
//! ```
use crate::page_aggregate::{
PageAggregate, PageBody, PageHead, PageIdentity, PageLayout, PageOptions,
PagePermissions, PageStats, PageTree,
};
use serde_json::Value;
/// PageAggregate 构建器。
///
/// 所有字段都有与当前 `build_page_aggregate_snapshot` 一致的默认值。
/// 使用 `build()` 方法消费 builder 并产出 `PageAggregate`。
#[derive(Debug)]
pub struct PageAggregateBuilder {
document_id: String,
workspace_id: String,
title: String,
updated_at: Value,
read_only: bool,
disable_download: bool,
disable_copy: bool,
wide_layout: bool,
small_text: bool,
layout_density: String,
show_heading_numbers: bool,
show_toc: bool,
show_structure: bool,
protect_editing: bool,
show_word_count: bool,
collapse_backlinks: bool,
page_font: String,
hide_child_pages: bool,
show_block_ref_count: bool,
embed_default_block_id: Value,
content: Value,
revision: Value,
conflict_detection_key: Value,
page_subtree: Value,
word_count: u64,
character_count: u64,
block_count: u64,
todo_total: u64,
todo_done: u64,
}
impl PageAggregateBuilder {
/// 创建新的构建器,所有字段使用与当前 `build_page_aggregate_snapshot` 一致的默认值。
pub fn new() -> Self {
Self {
document_id: String::new(),
workspace_id: "default".to_string(),
title: "无标题".to_string(),
updated_at: Value::Null,
read_only: false,
disable_download: false,
disable_copy: false,
wide_layout: false,
small_text: false,
layout_density: "normal".to_string(),
show_heading_numbers: true,
show_toc: false,
show_structure: false,
protect_editing: false,
show_word_count: true,
collapse_backlinks: false,
page_font: "default".to_string(),
hide_child_pages: false,
show_block_ref_count: false,
embed_default_block_id: Value::Null,
content: Value::Null,
revision: Value::Null,
conflict_detection_key: Value::Null,
page_subtree: Value::Null,
word_count: 0,
character_count: 0,
block_count: 0,
todo_total: 0,
todo_done: 0,
}
}
// ── Identity ──
pub fn document_id(mut self, value: impl Into<String>) -> Self {
self.document_id = value.into();
self
}
pub fn workspace_id(mut self, value: impl Into<String>) -> Self {
self.workspace_id = value.into();
self
}
// ── Head ──
pub fn title(mut self, value: impl Into<String>) -> Self {
self.title = value.into();
self
}
pub fn updated_at(mut self, value: Value) -> Self {
self.updated_at = value;
self
}
pub fn read_only(mut self, value: bool) -> Self {
self.read_only = value;
self
}
pub fn disable_download(mut self, value: bool) -> Self {
self.disable_download = value;
self
}
pub fn disable_copy(mut self, value: bool) -> Self {
self.disable_copy = value;
self
}
// ── Layout / PageOptions ──
pub fn wide_layout(mut self, value: bool) -> Self {
self.wide_layout = value;
self
}
pub fn small_text(mut self, value: bool) -> Self {
self.small_text = value;
self
}
pub fn layout_density(mut self, value: impl Into<String>) -> Self {
self.layout_density = value.into();
self
}
pub fn show_heading_numbers(mut self, value: bool) -> Self {
self.show_heading_numbers = value;
self
}
pub fn show_toc(mut self, value: bool) -> Self {
self.show_toc = value;
self
}
pub fn show_structure(mut self, value: bool) -> Self {
self.show_structure = value;
self
}
pub fn protect_editing(mut self, value: bool) -> Self {
self.protect_editing = value;
self
}
pub fn show_word_count(mut self, value: bool) -> Self {
self.show_word_count = value;
self
}
pub fn collapse_backlinks(mut self, value: bool) -> Self {
self.collapse_backlinks = value;
self
}
pub fn page_font(mut self, value: impl Into<String>) -> Self {
self.page_font = value.into();
self
}
pub fn hide_child_pages(mut self, value: bool) -> Self {
self.hide_child_pages = value;
self
}
pub fn show_block_ref_count(mut self, value: bool) -> Self {
self.show_block_ref_count = value;
self
}
pub fn embed_default_block_id(mut self, value: Value) -> Self {
self.embed_default_block_id = value;
self
}
// ── Body ──
pub fn content(mut self, value: Value) -> Self {
self.content = value;
self
}
pub fn revision(mut self, value: Value) -> Self {
self.revision = value;
self
}
pub fn conflict_detection_key(mut self, value: Value) -> Self {
self.conflict_detection_key = value;
self
}
// ── Tree ──
pub fn page_subtree(mut self, value: Value) -> Self {
self.page_subtree = value;
self
}
// ── Stats ──
pub fn word_count(mut self, value: u64) -> Self {
self.word_count = value;
self
}
pub fn character_count(mut self, value: u64) -> Self {
self.character_count = value;
self
}
pub fn block_count(mut self, value: u64) -> Self {
self.block_count = value;
self
}
pub fn todo_total(mut self, value: u64) -> Self {
self.todo_total = value;
self
}
pub fn todo_done(mut self, value: u64) -> Self {
self.todo_done = value;
self
}
// ── Build ──
/// 消费 builder 并产出 `PageAggregate`。
pub fn build(self) -> PageAggregate {
PageAggregate {
schema: "mnote.page_aggregate.v1".to_string(),
identity: PageIdentity {
document_id: self.document_id,
workspace_id: self.workspace_id,
},
head: PageHead {
title: self.title,
updated_at: self.updated_at,
permissions: PagePermissions {
read_only: self.read_only,
disable_download: self.disable_download,
disable_copy: self.disable_copy,
},
},
layout: PageLayout {
page_options: PageOptions {
wide_layout: self.wide_layout,
small_text: self.small_text,
layout_density: self.layout_density,
show_heading_numbers: self.show_heading_numbers,
show_toc: self.show_toc,
show_structure: self.show_structure,
protect_editing: self.protect_editing,
show_word_count: self.show_word_count,
collapse_backlinks: self.collapse_backlinks,
page_font: self.page_font,
hide_child_pages: self.hide_child_pages,
show_block_ref_count: self.show_block_ref_count,
embed_default_block_id: self.embed_default_block_id,
},
},
body: PageBody {
content: self.content,
revision: self.revision,
conflict_detection_key: self.conflict_detection_key,
},
tree: PageTree {
page_subtree: self.page_subtree,
},
stats: PageStats {
word_count: self.word_count,
character_count: self.character_count,
block_count: self.block_count,
todo_total: self.todo_total,
todo_done: self.todo_done,
},
}
}
}
impl Default for PageAggregateBuilder {
fn default() -> Self {
Self::new()
}
}