{"record":{"id":"932f7500f6d65f9e","repo":"Pumpkin-MC/Pumpkin","slug":"unexpected-event-932f75","errorCode":null,"errorMessage":"unexpected event","messagePattern":"unexpected event","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/pumpkin-plugin-api/src/events/inventory/craft_item.rs","lineNumber":13,"sourceCode":"use super::super::FromIntoEvent;\nuse crate::wit::pumpkin::plugin::event::{CraftItemEventData, Event, EventType};\n\n/// Event triggered when an item is crafted.\npub struct CraftItemEvent;\nimpl FromIntoEvent for CraftItemEvent {\n    const EVENT_TYPE: EventType = EventType::CraftItemEvent;\n    type Data = CraftItemEventData;\n\n    fn data_from_event(event: Event) -> Self::Data {\n        match event {\n            Event::CraftItemEvent(data) => data,\n            _ => panic!(\"unexpected event\"),\n        }\n    }\n\n    fn data_into_event(data: Self::Data) -> Event {\n        Event::CraftItemEvent(data)\n    }\n}\n","sourceCodeStart":1,"sourceCodeEnd":21,"githubUrl":"https://github.com/Pumpkin-MC/Pumpkin/blob/8d4639e25a57c15e47448ec327c780d41bbf2356/crates/pumpkin-plugin-api/src/events/inventory/craft_item.rs#L1-L21","documentation":"This panic fires in `data_from_event`, the `Event` trait implementation for `CraftItemEvent`. It matches only `Event::CraftItemEvent(data)`; any other `Event` variant means the dispatcher handed a wrong-type payload to the crafting handler. The library considers this a broken internal invariant and panics with \"unexpected event\".","triggerScenarios":"Dispatching a non-`CraftItemEvent` variant (e.g. `FurnaceExtractEvent`) into `data_from_event`, or registering this handler under a `EventType` other than `CraftItemEvent`.","commonSituations":"Mismatched handler registration tables, hand-written dispatch where inventory events are conflated, or an upgrade that changed the `Event` enum so the handler's match arm no longer aligns with what's dispatched.","solutions":["Register the handler with `EventType::CraftItemEvent` and verify the dispatch route sends only that variant.","When calling manually, wrap data with `CraftItemEvent::data_into_event(data)` first.","Keep pumpkin-plugin-api versions identical across crates and rebuild from clean.","Pre-narrow with `if let Event::CraftItemEvent(data) = event { ... }`.","Return `Option`/`Result` and log instead of panicking."],"exampleFix":"// before\nmatch event {\n    Event::CraftItemEvent(data) => data,\n    _ => panic!(\"unexpected event\"),\n}\n// after\nmatch event {\n    Event::CraftItemEvent(data) => data,\n    _ => log::warn!(\"CraftItemEvent handler got wrong event\"),\n    _ => return None,\n}","handlingStrategy":"type-guard","validationCode":"// Before dispatch\nassert_eq!(event.event_type(), EventType::CraftItemEvent, \"wrong event routed to CraftItem handler\");","typeGuard":"fn as_craft_item(event: &Event) -> Option<&CraftItemEventData> {\n    match event {\n        Event::CraftItemEvent(data) => Some(data),\n        _ => None,\n    }\n}","tryCatchPattern":"let result = std::panic::catch_unwind(AssertUnwindSafe(|| handler.data_from_event(event)));\nif result.is_err() {\n    log::error!(\"CraftItemEvent handler received an unexpected event variant\");\n}","preventionTips":["Register the handler with EventType::CraftItemEvent.","Use if-let narrowing instead of blind data_from_event calls.","Always wrap payload data with the type's data_into_event when producing Event values.","Pin identical pumpkin-plugin-api versions across the workspace.","Add a debug_assert in dispatch code comparing event.event_type() to the handler's EVENT_TYPE."],"tags":["rust","panic","event-dispatch","inventory"],"backgroundTag":"internal-invariant-violation","analyzedSha":"8d4639e25a57c15e47448ec327c780d41bbf2356","analyzedAt":"2026-09-09T15:32:22.916Z","contentChangedAt":"2026-09-09T15:32:22.916Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}