{"record":{"id":"5ff56537dcfd83d9","repo":"GraphiteEditor/Graphite","slug":"rectangle-node-can-t-be-found","errorCode":null,"errorMessage":"Rectangle node can't be found","messagePattern":"Rectangle node can't be found","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs","lineNumber":17,"sourceCode":"use super::shape_utility::ShapeToolModifierKey;\nuse super::*;\nuse crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_proto_node_type;\nuse crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;\nuse crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate};\nuse crate::messages::tool::common_functionality::graph_modification_utils;\nuse crate::messages::tool::tool_messages::tool_prelude::*;\nuse graph_craft::document::NodeInput;\nuse graph_craft::document::value::TaggedValue;\nuse std::collections::VecDeque;\n\n#[derive(Default)]\npub struct Rectangle;\n\nimpl Rectangle {\n\tpub fn create_node() -> NodeTemplate {\n\t\tlet node_type = resolve_proto_node_type(graphene_std::vector::generator_nodes::rectangle::IDENTIFIER).expect(\"Rectangle node can't be found\");\n\t\tnode_type.node_template_input_override([None, Some(NodeInput::value(TaggedValue::F64(1.), false)), Some(NodeInput::value(TaggedValue::F64(1.), false))])\n\t}\n\n\tpub fn update_shape(\n\t\tdocument: &DocumentMessageHandler,\n\t\tipp: &InputPreprocessorMessageHandler,\n\t\tviewport: &ViewportMessageHandler,\n\t\tlayer: LayerNodeIdentifier,\n\t\tshape_tool_data: &mut ShapeToolData,\n\t\tmodifier: ShapeToolModifierKey,\n\t\tresponses: &mut VecDeque<Message>,\n\t) {\n\t\tlet [center, lock_ratio, _] = modifier;\n\n\t\tif let Some([start, end]) = shape_tool_data.data.calculate_points(document, ipp, viewport, center, lock_ratio) {\n\t\t\tlet Some(node_id) = graph_modification_utils::get_rectangle_id(layer, &document.network_interface) else {\n\t\t\t\treturn;\n\t\t\t};","sourceCodeStart":1,"sourceCodeEnd":35,"githubUrl":"https://github.com/GraphiteEditor/Graphite/blob/c507b356453361e31638b8bff8f6d46b6da2961e/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs#L1-L35","documentation":"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.","triggerScenarios":"Starting a rectangle drag when generator_nodes::rectangle::IDENTIFIER is missing from DOCUMENT_NODE_TYPES after a rename, removal, or registration edit.","commonSituations":"Refactors of the rectangle generator module; Graphite version upgrades changing identifier namespaces; conditional compilation excluding the node.","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"],"exampleFix":"// before\nlet node_type = resolve_proto_node_type(graphene_std::vector::generator_nodes::rectangle::IDENTIFIER).expect(\"Rectangle node can't be found\");\n// after\nlet Some(node_type) = resolve_proto_node_type(graphene_std::vector::generator_nodes::rectangle::IDENTIFIER) else {\n\tlog::error!(\"Rectangle node definition missing from DOCUMENT_NODE_TYPES\");\n\treturn None;\n};","handlingStrategy":"validation","validationCode":"#[test]\nfn rectangle_node_registered() {\n\tassert!(document_node_definitions::resolve_proto_node_type(graphene_std::vector::generator_nodes::rectangle::IDENTIFIER).is_some());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["rust","graphite","panic","expect","node-registry","rectangle-tool"],"backgroundTag":"node-definition-not-found","analyzedSha":"c507b356453361e31638b8bff8f6d46b6da2961e","analyzedAt":"2026-08-16T21:57:18.596Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}