Skip to content

Commit 0a88104

Browse files
committed
Move contributor docs editor message structure tree generator from test to tools directory
1 parent 7af60e0 commit 0a88104

13 files changed

Lines changed: 142 additions & 111 deletions

File tree

.github/workflows/build-dev-and-ci.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,11 @@ jobs:
113113
- name: 📃 Generate code documentation info for website
114114
if: github.ref == 'refs/heads/master'
115115
run: |
116-
cargo test --package graphite-editor --lib -- messages::message::test::generate_message_tree
116+
cd tools/editor-message-tree
117+
cargo run
118+
cd ../..
117119
mkdir -p artifacts-generated
118-
mv hierarchical_message_system_tree.txt artifacts-generated/hierarchical_message_system_tree.txt
120+
mv website/generated/hierarchical_message_system_tree.txt artifacts-generated/hierarchical_message_system_tree.txt
119121
120122
- name: 💿 Obtain cache of auto-generated code docs artifacts, to check if they've changed
121123
if: github.ref == 'refs/heads/master'

.github/workflows/website.yml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,20 +67,23 @@ jobs:
6767
rustup update stable
6868
echo "🦀 Latest updated version of Rust:"
6969
rustc --version
70-
cargo test --package graphite-editor --lib -- messages::message::test::generate_message_tree
70+
cd tools/editor-message-tree
71+
cargo run
72+
cd ../..
7173
mkdir artifacts
72-
mv hierarchical_message_system_tree.txt artifacts/hierarchical_message_system_tree.txt
74+
mv website/generated/hierarchical_message_system_tree.txt artifacts/hierarchical_message_system_tree.txt
7375
74-
- name: 🚚 Move `artifacts` contents to the project root
76+
- name: 🚚 Move `artifacts` contents to website/generated
7577
run: |
76-
mv artifacts/* .
78+
mkdir -p website/generated
79+
mv artifacts/* website/generated/
7780
7881
- name: 🔧 Build auto-generated code docs artifacts into HTML
7982
run: |
8083
cd website
8184
npm run generate-editor-structure
8285
83-
- name: Generate node catalog documentation
86+
- name: 📃 Generate node catalog documentation
8487
run: |
8588
cd tools/node-docs
8689
cargo run

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,3 @@ flamegraph.svg
1111
.idea/
1212
.direnv
1313
.DS_Store
14-
hierarchical_message_system_tree.txt
15-
hierarchical_message_system_tree.html

Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ members = [
4040
"node-graph/preprocessor",
4141
"proc-macros",
4242
"tools/crate-hierarchy-viz",
43-
"tools/node-docs"
43+
"tools/editor-message-tree",
44+
"tools/node-docs",
4445
]
4546
default-members = [
4647
"editor",

editor/src/messages/message.rs

Lines changed: 3 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -53,97 +53,8 @@ impl specta::Type for MessageDiscriminant {
5353
}
5454
}
5555

56-
#[cfg(test)]
57-
mod test {
58-
use super::*;
59-
use std::io::Write;
60-
61-
#[test]
62-
fn generate_message_tree() {
63-
let result = Message::build_message_tree();
64-
let mut file = std::fs::File::create("../hierarchical_message_system_tree.txt").unwrap();
65-
file.write_all(format!("{} `{}`\n", result.name(), result.path()).as_bytes()).unwrap();
66-
if let Some(variants) = result.variants() {
67-
for (i, variant) in variants.iter().enumerate() {
68-
let is_last = i == variants.len() - 1;
69-
print_tree_node(variant, "", is_last, &mut file);
70-
}
71-
}
72-
}
73-
74-
fn print_tree_node(tree: &DebugMessageTree, prefix: &str, is_last: bool, file: &mut std::fs::File) {
75-
// Print the current node
76-
let (branch, child_prefix) = if tree.message_handler_data_fields().is_some() || tree.message_handler_fields().is_some() {
77-
("├── ", format!("{prefix}│ "))
78-
} else if is_last {
79-
("└── ", format!("{prefix} "))
80-
} else {
81-
("├── ", format!("{prefix}│ "))
82-
};
83-
84-
if tree.path().is_empty() {
85-
file.write_all(format!("{}{}{}\n", prefix, branch, tree.name()).as_bytes()).unwrap();
86-
} else {
87-
file.write_all(format!("{}{}{} `{}`\n", prefix, branch, tree.name(), tree.path()).as_bytes()).unwrap();
88-
}
89-
90-
// Print children if any
91-
if let Some(variants) = tree.variants() {
92-
let len = variants.len();
93-
for (i, variant) in variants.iter().enumerate() {
94-
let is_last_child = i == len - 1;
95-
print_tree_node(variant, &child_prefix, is_last_child, file);
96-
}
97-
}
98-
99-
// Print message field if any
100-
if let Some(fields) = tree.fields() {
101-
let len = fields.len();
102-
for (i, field) in fields.iter().enumerate() {
103-
let is_last_field = i == len - 1;
104-
let branch = if is_last_field { "└── " } else { "├── " };
105-
106-
file.write_all(format!("{child_prefix}{branch}{field}\n").as_bytes()).unwrap();
107-
}
108-
}
109-
110-
// Print handler field if any
111-
if let Some(data) = tree.message_handler_fields() {
112-
let len = data.fields().len();
113-
let (branch, child_prefix) = if tree.message_handler_data_fields().is_some() {
114-
("├── ", format!("{prefix}│ "))
115-
} else {
116-
("└── ", format!("{prefix} "))
117-
};
118-
119-
const FRONTEND_MESSAGE_STR: &str = "FrontendMessage";
120-
if data.name().is_empty() && tree.name() != FRONTEND_MESSAGE_STR {
121-
panic!("{}'s MessageHandler is missing #[message_handler_data]", tree.name());
122-
} else if tree.name() != FRONTEND_MESSAGE_STR {
123-
file.write_all(format!("{}{}{} `{}`\n", prefix, branch, data.name(), data.path()).as_bytes()).unwrap();
124-
125-
for (i, field) in data.fields().iter().enumerate() {
126-
let is_last_field = i == len - 1;
127-
let branch = if is_last_field { "└── " } else { "├── " };
128-
129-
file.write_all(format!("{}{}{}\n", child_prefix, branch, field.0).as_bytes()).unwrap();
130-
}
131-
}
132-
}
133-
134-
// Print data field if any
135-
if let Some(data) = tree.message_handler_data_fields() {
136-
let len = data.fields().len();
137-
if data.path().is_empty() {
138-
file.write_all(format!("{}{}{}\n", prefix, "└── ", data.name()).as_bytes()).unwrap();
139-
} else {
140-
file.write_all(format!("{}{}{} `{}`\n", prefix, "└── ", data.name(), data.path()).as_bytes()).unwrap();
141-
}
142-
for (i, field) in data.fields().iter().enumerate() {
143-
let is_last_field = i == len - 1;
144-
let branch = if is_last_field { "└── " } else { "├── " };
145-
file.write_all(format!("{}{}{}\n", format!("{} ", prefix), branch, field.0).as_bytes()).unwrap();
146-
}
147-
}
56+
impl Message {
57+
pub fn message_tree() -> DebugMessageTree {
58+
Self::build_message_tree()
14859
}
14960
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[package]
2+
name = "editor-message-tree"
3+
description = "Tool to generate developer documentation for the editor message system structure"
4+
edition.workspace = true
5+
version.workspace = true
6+
license.workspace = true
7+
authors.workspace = true
8+
9+
[dependencies]
10+
# Local dependencies
11+
editor = { path = "../../editor", package = "graphite-editor" }
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
use editor::messages::message::Message;
2+
use editor::utility_types::DebugMessageTree;
3+
use std::io::Write;
4+
5+
fn main() {
6+
let result = Message::message_tree();
7+
std::fs::create_dir_all("../../website/generated").unwrap();
8+
let mut file = std::fs::File::create("../../website/generated/hierarchical_message_system_tree.txt").unwrap();
9+
file.write_all(format!("{} `{}`\n", result.name(), result.path()).as_bytes()).unwrap();
10+
if let Some(variants) = result.variants() {
11+
for (i, variant) in variants.iter().enumerate() {
12+
let is_last = i == variants.len() - 1;
13+
print_tree_node(variant, "", is_last, &mut file);
14+
}
15+
}
16+
}
17+
18+
fn print_tree_node(tree: &DebugMessageTree, prefix: &str, is_last: bool, file: &mut std::fs::File) {
19+
// Print the current node
20+
let (branch, child_prefix) = if tree.message_handler_data_fields().is_some() || tree.message_handler_fields().is_some() {
21+
("├── ", format!("{prefix}│ "))
22+
} else if is_last {
23+
("└── ", format!("{prefix} "))
24+
} else {
25+
("├── ", format!("{prefix}│ "))
26+
};
27+
28+
if tree.path().is_empty() {
29+
file.write_all(format!("{}{}{}\n", prefix, branch, tree.name()).as_bytes()).unwrap();
30+
} else {
31+
file.write_all(format!("{}{}{} `{}`\n", prefix, branch, tree.name(), tree.path()).as_bytes()).unwrap();
32+
}
33+
34+
// Print children if any
35+
if let Some(variants) = tree.variants() {
36+
let len = variants.len();
37+
for (i, variant) in variants.iter().enumerate() {
38+
let is_last_child = i == len - 1;
39+
print_tree_node(variant, &child_prefix, is_last_child, file);
40+
}
41+
}
42+
43+
// Print message field if any
44+
if let Some(fields) = tree.fields() {
45+
let len = fields.len();
46+
for (i, field) in fields.iter().enumerate() {
47+
let is_last_field = i == len - 1;
48+
let branch = if is_last_field { "└── " } else { "├── " };
49+
50+
file.write_all(format!("{child_prefix}{branch}{field}\n").as_bytes()).unwrap();
51+
}
52+
}
53+
54+
// Print handler field if any
55+
if let Some(data) = tree.message_handler_fields() {
56+
let len = data.fields().len();
57+
let (branch, child_prefix) = if tree.message_handler_data_fields().is_some() {
58+
("├── ", format!("{prefix}│ "))
59+
} else {
60+
("└── ", format!("{prefix} "))
61+
};
62+
63+
const FRONTEND_MESSAGE_STR: &str = "FrontendMessage";
64+
if data.name().is_empty() && tree.name() != FRONTEND_MESSAGE_STR {
65+
panic!("{}'s MessageHandler is missing #[message_handler_data]", tree.name());
66+
} else if tree.name() != FRONTEND_MESSAGE_STR {
67+
file.write_all(format!("{}{}{} `{}`\n", prefix, branch, data.name(), data.path()).as_bytes()).unwrap();
68+
69+
for (i, field) in data.fields().iter().enumerate() {
70+
let is_last_field = i == len - 1;
71+
let branch = if is_last_field { "└── " } else { "├── " };
72+
73+
file.write_all(format!("{}{}{}\n", child_prefix, branch, field.0).as_bytes()).unwrap();
74+
}
75+
}
76+
}
77+
78+
// Print data field if any
79+
if let Some(data) = tree.message_handler_data_fields() {
80+
let len = data.fields().len();
81+
if data.path().is_empty() {
82+
file.write_all(format!("{}{}{}\n", prefix, "└── ", data.name()).as_bytes()).unwrap();
83+
} else {
84+
file.write_all(format!("{}{}{} `{}`\n", prefix, "└── ", data.name(), data.path()).as_bytes()).unwrap();
85+
}
86+
for (i, field) in data.fields().iter().enumerate() {
87+
let is_last_field = i == len - 1;
88+
let branch = if is_last_field { "└── " } else { "├── " };
89+
let field = &field.0;
90+
file.write_all(format!("{prefix} {branch}{field}\n").as_bytes()).unwrap();
91+
}
92+
}
93+
}

website/.build-scripts/generate-editor-structure.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// TODO: Port this script to Rust as part of `tools/editor-message-tree/src/main.rs`
2+
13
/* eslint-disable no-console */
24

35
import fs from "fs";

website/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
node_modules/
22
public/
3+
generated/
34
static/*
45
!static/js/
56
content/learn/node-catalog

0 commit comments

Comments
 (0)