Files
mnote/rust/crates/core-protocol/src/mindmap.rs
T

202 lines
6.0 KiB
Rust

use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct MindmapProjection {
pub schema: String,
pub map_id: String,
pub root_node: String,
#[serde(default)]
pub nodes: Vec<MindmapProjectionNode>,
#[serde(default)]
pub edges: Vec<MindmapProjectionEdge>,
#[serde(default)]
pub layout_hints: Value,
pub revision: u64,
pub owner: MindmapProjectionOwner,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct MindmapProjectionNode {
pub node_id: String,
pub title: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct MindmapProjectionEdge {
pub edge_id: String,
pub from_node_id: String,
pub to_node_id: String,
pub edge_kind: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub enum MindmapProjectionOwner {
RustKernel,
CompatBlob,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum MindmapCommand {
CreateNode {
#[serde(rename = "mapId", alias = "map_id")]
map_id: String,
#[serde(rename = "parentId", alias = "parent_id")]
parent_id: String,
node: MindmapNodeInput,
},
RenameNode {
#[serde(rename = "mapId", alias = "map_id")]
map_id: String,
#[serde(rename = "nodeId", alias = "node_id")]
node_id: String,
title: String,
},
MoveNode {
#[serde(rename = "mapId", alias = "map_id")]
map_id: String,
#[serde(rename = "nodeId", alias = "node_id")]
node_id: String,
#[serde(rename = "newParentId", alias = "new_parent_id")]
new_parent_id: String,
#[serde(rename = "sortOrder", alias = "sort_order")]
sort_order: Option<i64>,
},
DeleteNode {
#[serde(rename = "mapId", alias = "map_id")]
map_id: String,
#[serde(rename = "nodeId", alias = "node_id")]
node_id: String,
},
SetLayout {
#[serde(rename = "mapId", alias = "map_id")]
map_id: String,
#[serde(rename = "layoutHints", alias = "layout_hints")]
layout_hints: Value,
},
AttachPageRef {
#[serde(rename = "mapId", alias = "map_id")]
map_id: String,
#[serde(rename = "nodeId", alias = "node_id")]
node_id: String,
#[serde(rename = "pageId", alias = "page_id")]
page_id: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct MindmapNodeRef {
pub kind: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub asset_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub slide: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub snippet: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct MindmapNodeData {
#[serde(skip_serializing_if = "Option::is_none")]
pub uid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hyperlink: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub refs: Option<Vec<MindmapNodeRef>>,
#[serde(flatten, default)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MindmapTreeNode {
pub data: MindmapNodeData,
#[serde(default)]
pub children: Vec<MindmapTreeNode>,
#[serde(flatten, default)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct MindmapNodeInput {
#[serde(skip_serializing_if = "Option::is_none")]
pub uid: Option<String>,
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub hyperlink: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub refs: Option<Vec<MindmapNodeRef>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "op", rename_all = "camelCase")]
pub enum MindmapOp {
#[serde(alias = "add_child")]
AddChild {
#[serde(rename = "parentUid")]
#[serde(alias = "parent_uid")]
parent_uid: String,
node: MindmapNodeInput,
},
#[serde(alias = "add_sibling_after")]
AddSiblingAfter {
#[serde(rename = "targetUid")]
#[serde(alias = "target_uid")]
target_uid: String,
node: MindmapNodeInput,
},
#[serde(alias = "update_node", alias = "updateNode")]
UpdateText {
uid: String,
#[serde(alias = "value")]
text: String,
},
#[serde(alias = "set_link", alias = "set_hyperlink")]
SetHyperlink {
#[serde(alias = "id")]
uid: String,
#[serde(alias = "url")]
hyperlink: Option<String>,
},
#[serde(alias = "set_refs")]
SetRefs {
#[serde(alias = "id")]
uid: String,
refs: Vec<MindmapNodeRef>,
},
#[serde(alias = "append_note")]
AppendNote {
#[serde(alias = "id")]
uid: String,
#[serde(alias = "note")]
markdown: String,
},
#[serde(alias = "delete_node")]
DeleteNode {
#[serde(alias = "id")]
uid: String,
},
}