{"record":{"id":"16c26ad0906d328c","repo":"zellij-org/zellij","slug":"unspecified-bare-key","errorCode":null,"errorMessage":"Unspecified bare key","messagePattern":"Unspecified bare key","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"zellij-utils/src/ipc/enum_conversions.rs","lineNumber":89,"sourceCode":"            ProtoBareKey::F5 => Ok(BareKey::F(5)),\n            ProtoBareKey::F6 => Ok(BareKey::F(6)),\n            ProtoBareKey::F7 => Ok(BareKey::F(7)),\n            ProtoBareKey::F8 => Ok(BareKey::F(8)),\n            ProtoBareKey::F9 => Ok(BareKey::F(9)),\n            ProtoBareKey::F10 => Ok(BareKey::F(10)),\n            ProtoBareKey::F11 => Ok(BareKey::F(11)),\n            ProtoBareKey::F12 => Ok(BareKey::F(12)),\n            ProtoBareKey::Char => Err(anyhow!(\"Character key needs character data\")),\n            ProtoBareKey::Tab => Ok(BareKey::Tab),\n            ProtoBareKey::Esc => Ok(BareKey::Esc),\n            ProtoBareKey::Enter => Ok(BareKey::Enter),\n            ProtoBareKey::CapsLock => Ok(BareKey::CapsLock),\n            ProtoBareKey::ScrollLock => Ok(BareKey::ScrollLock),\n            ProtoBareKey::NumLock => Ok(BareKey::NumLock),\n            ProtoBareKey::PrintScreen => Ok(BareKey::PrintScreen),\n            ProtoBareKey::Pause => Ok(BareKey::Pause),\n            ProtoBareKey::Menu => Ok(BareKey::Menu),\n            ProtoBareKey::Unspecified => Err(anyhow!(\"Unspecified bare key\")),\n        }\n    }\n}\n\n// KeyModifier conversions\nimpl From<KeyModifier> for ProtoKeyModifier {\n    fn from(modifier: KeyModifier) -> Self {\n        match modifier {\n            KeyModifier::Ctrl => ProtoKeyModifier::Ctrl,\n            KeyModifier::Alt => ProtoKeyModifier::Alt,\n            KeyModifier::Shift => ProtoKeyModifier::Shift,\n            KeyModifier::Super => ProtoKeyModifier::Super,\n        }\n    }\n}\n\nimpl TryFrom<ProtoKeyModifier> for KeyModifier {\n    type Error = anyhow::Error;","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/zellij-org/zellij/blob/bf8d23a4f774abf27a108da2a1a2689e7d8d0d23/zellij-utils/src/ipc/enum_conversions.rs#L71-L107","documentation":"Thrown by TryFrom<ProtoBareKey> for BareKey when the proto enum holds its default/placeholder value Unspecified. In proto3 an unset enum serializes as 0, which maps to Unspecified, so this means the sender never set bare_key (or explicitly sent the placeholder) on a KeyWithModifier message.","triggerScenarios":"Constructing or receiving a key message with bare_key left at default — e.g. handcrafted IPC frames, a client library that only sets modifiers, or a defaulted/empty message passed through bare_key_from_proto_i32 (which succeeds at from_i32(0) then fails at try_into).","commonSituations":"First drafts of custom zellij clients/web clients; test fixtures built with struct-default field values; version skew where a newer message shape stops filling the field.","solutions":["Set an explicit non-Char, non-Unspecified bare_key on every key message you send (Char additionally needs the character field).","Validate inbound frames at your boundary: reject bare_key == Unspecified (i32 0) before conversion.","If receiving this from zellij itself, check for client/server version mismatch and align versions."],"exampleFix":"// before: default proto leaves the enum unset\nlet msg = KeyWithModifier { key_modifiers: vec![Ctrl as i32], ..Default::default() };\nlet key: KeyWithModifier = msg.try_into()?; // Err(\"Unspecified bare key\")\n\n// after: set the discriminant explicitly\nlet msg = KeyWithModifier { bare_key: BareKey::Enter as i32, key_modifiers: vec![Ctrl as i32], character: None };\nlet key: KeyWithModifier = msg.try_into()?;","handlingStrategy":"type-guard","validationCode":"// reject frames whose bare_key was never set\nif msg.bare_key == ProtoBareKey::Unspecified as i32 { // covers i32 0\n    return Ok(None); // ignore malformed frame\n}","typeGuard":"fn has_bare_key(k: &ProtoKeyWithModifier) -> bool {\n    ProtoBareKey::from_i32(k.bare_key)\n        .map(|key| key != ProtoBareKey::Unspecified)\n        .unwrap_or(false)\n}","tryCatchPattern":"match bare_key_from_proto_i32(msg.bare_key) {\n    Ok(key) => Some(key),\n    Err(e) if e.to_string() == \"Unspecified bare key\" => {\n        log::debug!(\"ignoring key frame with unset bare_key\");\n        None\n    },\n    Err(e) => return Err(e),\n}","preventionTips":["Set every enum field explicitly when constructing protos; audit for ..Default::default() on message types with enums.","Validate at the IPC boundary that bare_key is present-and-known before deeper processing.","Keep client/server zellij versions aligned so field expectations match."],"tags":["zellij","rust","protobuf","ipc","key-encoding","default-value"],"backgroundTag":"invalid-enum-value","analyzedSha":"bf8d23a4f774abf27a108da2a1a2689e7d8d0d23","analyzedAt":"2026-08-19T07:42:58.758Z","contentChangedAt":"2026-08-19T07:42:58.758Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}