{"record":{"id":"eeafc02b3dc057d1","repo":"FyroxEngine/Fyrox","slug":"resource-manager-must-be-available-when-deserializ","errorCode":null,"errorMessage":"Resource manager must be available when deserializing resources!","messagePattern":"Resource manager must be available when deserializing resources!","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"fyrox-resource/src/untyped.rs","lineNumber":347,"sourceCode":"\nimpl UntypedResource {\n    /// Visit this resource handle with the given UUID for the type of the resource data.\n    pub fn visit_with_type_uuid(\n        &mut self,\n        name: &str,\n        type_uuid: Option<Uuid>,\n        visitor: &mut Visitor,\n    ) -> VisitResult {\n        let mut region = visitor.enter_region(name)?;\n        if region.is_reading() {\n            let mut uuid = Uuid::default();\n            uuid.visit(\"Uuid\", &mut region)?;\n            self.read_visit(uuid, type_uuid, &mut region)?;\n            drop(region);\n            let resource_manager = visitor\n                .blackboard\n                .get::<ResourceManager>()\n                .expect(\"Resource manager must be available when deserializing resources!\")\n                .clone();\n            resource_manager.state().request_resource(self);\n            Ok(())\n        } else {\n            self.resource_uuid().visit(\"Uuid\", &mut region)?;\n            let header_guard = self.lock();\n            let is_embedded = header_guard.kind.is_embedded();\n            let is_ok = header_guard.state.is_ok();\n            drop(header_guard);\n            if is_embedded && is_ok {\n                self.0.visit(\"Embedded\", &mut region)\n            } else if is_embedded {\n                true.visit(\"Default\", &mut region)\n            } else {\n                Ok(())\n            }\n        }\n    }","sourceCodeStart":329,"sourceCodeEnd":365,"githubUrl":"https://github.com/FyroxEngine/Fyrox/blob/76c91aad8eca488ce527b1af707be8b3b24ad72d/fyrox-resource/src/untyped.rs#L329-L365","documentation":"When deserializing a Resource in 'by handle/uuid' mode, visit_with_type_uuid fetches the ResourceManager from the visitor blackboard to re-request the resource. If no ResourceManager was registered on the visitor, it panics. Deserializing resources therefore requires the resource manager to be part of the visitor environment.","triggerScenarios":"Calling UntypedResource::visit (deserializing a resource reference) with a Visitor that lacks a registered ResourceManager in its blackboard — common when saving/loading resources manually instead of through the standard loaders.","commonSituations":"Hand-rolling serialization of assets outside the engine's loaders; test harnesses that build Visitors without the resource manager; editor tooling that serializes resource references with a bare Visitor.","solutions":["Register the ResourceManager in the visitor blackboard before visiting: visitor.blackboard.register(resource_manager.clone()).","Use the engine/scene standard save/load paths (SceneLoader, ResourceManager) which set up the environment automatically.","If only serializing values (not resource references), ensure the resource is embedded rather than referenced, avoiding the manager lookup branch."],"exampleFix":"// before\nlet mut visitor = Visitor::new();\nresource.visit(\"MyResource\", &mut visitor)?; // panics\n// after\nlet mut visitor = Visitor::new();\nvisitor.blackboard.register(resource_manager.clone());\nresource.visit(\"MyResource\", &mut visitor)?;","handlingStrategy":"validation","validationCode":"assert!(visitor.blackboard.get_opt::<ResourceManager>().is_some());","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Register ResourceManager in the visitor blackboard before deserializing resource references","Use standard save/load APIs that configure the visitor environment"],"tags":["deserialization","panic","resource-manager","fyrox"],"backgroundTag":"missing-dependency","analyzedSha":"76c91aad8eca488ce527b1af707be8b3b24ad72d","analyzedAt":"2026-09-10T16:04:01.633Z","contentChangedAt":"2026-09-10T16:04:01.633Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}