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

  1. Check the registration entry for the rectangle identifier in document_node_definitions.rs
  2. Re-align const and registration key, then rebuild
  3. Convert to let-else / Option<NodeTemplate> so the failure is graceful
  4. 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

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.