{"record":{"id":"a2b45c6594d45cf9","repo":"Pumpkin-MC/Pumpkin","slug":"unexpected-event-a2b45c","errorCode":null,"errorMessage":"unexpected event","messagePattern":"unexpected event","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/pumpkin-plugin-api/src/events/inventory/furnace_burn.rs","lineNumber":13,"sourceCode":"use super::super::FromIntoEvent;\nuse crate::wit::pumpkin::plugin::event::{Event, EventType, FurnaceBurnEventData};\n\n/// Event triggered when fuel is burned in a furnace.\npub struct FurnaceBurnEvent;\nimpl FromIntoEvent for FurnaceBurnEvent {\n    const EVENT_TYPE: EventType = EventType::FurnaceBurnEvent;\n    type Data = FurnaceBurnEventData;\n\n    fn data_from_event(event: Event) -> Self::Data {\n        match event {\n            Event::FurnaceBurnEvent(data) => data,\n            _ => panic!(\"unexpected event\"),\n        }\n    }\n\n    fn data_into_event(data: Self::Data) -> Event {\n        Event::FurnaceBurnEvent(data)\n    }\n}\n","sourceCodeStart":1,"sourceCodeEnd":21,"githubUrl":"https://github.com/Pumpkin-MC/Pumpkin/blob/8d4639e25a57c15e47448ec327c780d41bbf2356/crates/pumpkin-plugin-api/src/events/inventory/furnace_burn.rs#L1-L21","documentation":"This panic fires in `data_from_event`, the `Event` trait implementation for `FurnaceBurnEvent`. It extracts data only from `Event::FurnaceBurnEvent(data)`; any other `Event` variant indicates the dispatcher sent the wrong event type to the furnace-burn handler. The library treats the mismatch as an invariant break and panics with \"unexpected event\".","triggerScenarios":"Calling `data_from_event` with a non-`FurnaceBurnEvent` variant — e.g. furnace smelt/extract events routed here — or a handler registration keyed to the wrong `EventType`.","commonSituations":"Copy-paste handler registration that mixes furnace event types, custom dispatch logic, or `Event` enum drift between server and plugin versions after an upgrade.","solutions":["Register the handler for `EventType::FurnaceBurnEvent` so only that variant is dispatched to it.","Use `FurnaceBurnEvent::data_into_event(data)` when constructing the event for manual calls.","Synchronize pumpkin-plugin-api versions and clean-rebuild to fix enum mismatches.","Check the variant before calling: `if let Event::FurnaceBurnEvent(data) = event { ... }`.","Swap the panic for a logged error or `Result` return to avoid crashing the server."],"exampleFix":"// before\nmatch event {\n    Event::FurnaceBurnEvent(data) => data,\n    _ => panic!(\"unexpected event\"),\n}\n// after\nmatch event {\n    Event::FurnaceBurnEvent(data) => data,\n    _ => return Err(EventDispatchError::UnexpectedVariant),\n}","handlingStrategy":"type-guard","validationCode":"// Before dispatch\nassert_eq!(event.event_type(), EventType::FurnaceBurnEvent, \"wrong event routed to FurnaceBurn handler\");","typeGuard":"fn as_furnace_burn(event: &Event) -> Option<&FurnaceBurnEventData> {\n    match event {\n        Event::FurnaceBurnEvent(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!(\"FurnaceBurnEvent handler received an unexpected event variant\");\n}","preventionTips":["Register furnace handlers with their exact EventType — don't share one registration across FurnaceBurn/Smelt/Extract.","Narrow with if-let before calling data_from_event manually.","Construct events via FurnaceBurnEvent::data_into_event.","Sync plugin-api versions and clean-rebuild after upgrades.","Route furnace events through a per-variant match, not a catch-all fallthrough."],"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"}