GraphiteEditor/Graphite · critical
Rectangle node can't be found
Error message
Rectangle node can't be found
What it means
Rectangle::create_node resolves the Rectangle generator node via resolve_proto_node_type(graphene_std::vector::generator_nodes::rectangle::IDENTIFIER).expect("Rectangle node can't be found") (rectangle_shape.rs:17). Like the other shape tools, this is a static-registry lookup (DOCUMENT_NODE_TYPES, document_node_definitions.rs:130; resolve_proto_node_type at 1480) whose None is converted to a panic. It indicates the Rectangle identifier is not registered — a code drift, hit on the first rectangle draw.
Source
Thrown at editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs:17
use super::shape_utility::ShapeToolModifierKey;
use super::*;
use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_proto_node_type;
use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;
use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate};
use crate::messages::tool::common_functionality::graph_modification_utils;
use crate::messages::tool::tool_messages::tool_prelude::*;
use graph_craft::document::NodeInput;
use graph_craft::document::value::TaggedValue;
use std::collections::VecDeque;
#[derive(Default)]
pub struct Rectangle;
impl Rectangle {
pub fn create_node() -> NodeTemplate {
let node_type = resolve_proto_node_type(graphene_std::vector::generator_nodes::rectangle::IDENTIFIER).expect("Rectangle node can't be found");
node_type.node_template_input_override([None, Some(NodeInput::value(TaggedValue::F64(1.), false)), Some(NodeInput::value(TaggedValue::F64(1.), false))])
}
pub fn update_shape(
document: &DocumentMessageHandler,
ipp: &InputPreprocessorMessageHandler,
viewport: &ViewportMessageHandler,
layer: LayerNodeIdentifier,
shape_tool_data: &mut ShapeToolData,
modifier: ShapeToolModifierKey,
responses: &mut VecDeque<Message>,
) {
let [center, lock_ratio, _] = modifier;
if let Some([start, end]) = shape_tool_data.data.calculate_points(document, ipp, viewport, center, lock_ratio) {
let Some(node_id) = graph_modification_utils::get_rectangle_id(layer, &document.network_interface) else {
return;
};View on GitHub (pinned to c507b35645)
Solutions
- Check the registration entry for the rectangle identifier in document_node_definitions.rs
- Re-align const and registration key, then rebuild
- Convert to let-else / Option<NodeTemplate> so the failure is graceful
- Keep the input-override array ([None, Some(F64(1.)), Some(F64(1.))]) in sync with the node's input count to avoid the adjacent index panic in node_template_input_override
Example fix
// before
let node_type = resolve_proto_node_type(graphene_std::vector::generator_nodes::rectangle::IDENTIFIER).expect("Rectangle node can't be found");
// after
let Some(node_type) = resolve_proto_node_type(graphene_std::vector::generator_nodes::rectangle::IDENTIFIER) else {
log::error!("Rectangle node definition missing from DOCUMENT_NODE_TYPES");
return None;
}; Defensive patterns
Strategy: validation
Validate before calling
#[test]
fn rectangle_node_registered() {
assert!(document_node_definitions::resolve_proto_node_type(graphene_std::vector::generator_nodes::rectangle::IDENTIFIER).is_some());
} Prevention
- Run the registry tests whenever document_node_definitions.rs is touched
- Reference generator identifiers via their consts, never string literals
- After changing a generator node's input count, update every create_node override array that targets it
When it happens
Trigger: Starting a rectangle drag when generator_nodes::rectangle::IDENTIFIER is missing from DOCUMENT_NODE_TYPES after a rename, removal, or registration edit.
Common situations: Refactors of the rectangle generator module; Graphite version upgrades changing identifier namespaces; conditional compilation excluding the node.
Related errors
AI-assisted analysis of GraphiteEditor/Graphite@c507b35645 (2026-08-16).
Data as JSON: /api/errors/5ff56537dcfd83d9.
Report an issue: GitHub.