{"record":{"id":"a93be45ef028819a","repo":"sxyazi/yazi","slug":"missing-payload-in-payload","errorCode":null,"errorMessage":"Missing 'payload' in Payload","messagePattern":"Missing 'payload' in Payload","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"yazi-dds/src/payload.rs","lineNumber":84,"sourceCode":"\n\t\tlet sender =\n\t\t\tparts.next().and_then(|s| s.parse().ok()).ok_or_else(|| anyhow!(\"invalid sender\"))?;\n\n\t\tlet body = parts.next().ok_or_else(|| anyhow!(\"empty body\"))?;\n\n\t\tOk(Self { receiver, sender, body: Ember::from_str(kind, body)? })\n\t}\n}\n\nimpl<'a> From<Ember<'a>> for Payload<'a> {\n\tfn from(value: Ember<'a>) -> Self { Self::new(value) }\n}\n\nimpl TryFrom<ActionCow> for Payload<'_> {\n\ttype Error = anyhow::Error;\n\n\tfn try_from(mut a: ActionCow) -> Result<Self, Self::Error> {\n\t\ta.take_any2(\"payload\").ok_or_else(|| anyhow!(\"Missing 'payload' in Payload\"))?\n\t}\n}\n\nimpl Display for Payload<'_> {\n\tfn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n\t\tlet result = match &self.body {\n\t\t\tEmber::Hi(b) => serde_json::to_string(b),\n\t\t\tEmber::Hey(b) => serde_json::to_string(b),\n\t\t\tEmber::Bye(b) => serde_json::to_string(b),\n\t\t\tEmber::Cd(b) => serde_json::to_string(b),\n\t\t\tEmber::Load(b) => serde_json::to_string(b),\n\t\t\tEmber::Hover(b) => serde_json::to_string(b),\n\t\t\tEmber::Tab(b) => serde_json::to_string(b),\n\t\t\tEmber::Rename(b) => serde_json::to_string(b),\n\t\t\tEmber::BulkRename(b) => serde_json::to_string(b),\n\t\t\tEmber::Yank(b) => serde_json::to_string(b),\n\t\t\tEmber::Duplicate(b) => serde_json::to_string(b),\n\t\t\tEmber::Move(b) => serde_json::to_string(b),","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/sxyazi/yazi/blob/94abcfa92f4ad3f0a1aef6c1ea083cfb8aa6c8c2/yazi-dds/src/payload.rs#L66-L102","documentation":"Besides the string form, Payload is reconstructed in-process from an Action (TryFrom<ActionCow>) by taking the attached \"payload\" value via take_any2(\"payload\"). If the action was built without a payload attached — or the value was already consumed by an earlier take — conversion fails with \"Missing 'payload' in Payload\".","triggerScenarios":"Emitting an accept_payload relay without .with_any(\"payload\", payload), replaying a serialized action that lost its attachments, or a code path that calls take_any2/take_any(\"payload\") before the TryFrom conversion runs.","commonSituations":"Custom plugins relaying payloads between components; refactors that move the conversion after another consumer of the same key.","solutions":["Attach the payload when creating the action: relay!(app:accept_payload).with_any(\"payload\", payload)","Ensure exactly one consumer takes the \"payload\" value from the action","Prefer constructing Payload directly (Payload::new / From<Ember>) instead of round-tripping through an Action"],"exampleFix":"// before\nemit!(Call(relay!(app:accept_payload)));\n\n// after\nemit!(Call(relay!(app:accept_payload).with_any(\"payload\", payload)));","handlingStrategy":"validation","validationCode":"// Ensure the action still carries the payload before converting:\nensure!(action.get::<Payload>(\"payload\").is_some(), \"action is missing its payload\");\nlet p = Payload::try_from(action)?;","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Attach the payload at action-construction time with .with_any(\"payload\", p)\n","Allow exactly one consumer of the \"payload\" key per action","Prefer direct Payload::new over round-tripping through actions"],"tags":["dds","actions","events","payload"],"backgroundTag":null,"analyzedSha":"94abcfa92f4ad3f0a1aef6c1ea083cfb8aa6c8c2","analyzedAt":"2026-08-16T09:56:24.836Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}