From 002b742cd9c4abe51e12112382c2837ca20339b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20misaki=20masa?= Date: Wed, 18 Jun 2025 10:46:31 +0800 Subject: [PATCH] feat: support tables with invalid UTF-8 keys in sendable data (#2890) --- yazi-dds/src/sendable.rs | 15 +++++++++++---- yazi-shared/src/event/data.rs | 2 ++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/yazi-dds/src/sendable.rs b/yazi-dds/src/sendable.rs index 3ff207a3..1d59f442 100644 --- a/yazi-dds/src/sendable.rs +++ b/yazi-dds/src/sendable.rs @@ -190,11 +190,17 @@ impl Sendable { fn value_to_key(value: Value) -> mlua::Result { Ok(match value { Value::Nil => DataKey::Nil, - Value::Boolean(v) => DataKey::Boolean(v), + Value::Boolean(b) => DataKey::Boolean(b), Value::LightUserData(_) => Err("light userdata is not supported".into_lua_err())?, - Value::Integer(v) => DataKey::Integer(v), - Value::Number(v) => DataKey::Number(OrderedFloat::new(v)), - Value::String(v) => DataKey::String(Cow::Owned(v.to_str()?.to_owned())), + Value::Integer(i) => DataKey::Integer(i), + Value::Number(n) => DataKey::Number(OrderedFloat::new(n)), + Value::String(s) => { + if let Ok(s) = s.to_str() { + DataKey::String(s.to_owned().into()) + } else { + DataKey::Bytes(s.as_bytes().to_owned()) + } + } Value::Table(_) => Err("table is not supported".into_lua_err())?, Value::Function(_) => Err("function is not supported".into_lua_err())?, Value::Thread(_) => Err("thread is not supported".into_lua_err())?, @@ -234,6 +240,7 @@ impl Sendable { DataKey::Id(i) => yazi_binding::Id(*i).into_lua(lua)?, DataKey::Url(u) => yazi_binding::Url::new(u.clone()).into_lua(lua)?, DataKey::Urn(u) => yazi_binding::Urn::new(u.clone()).into_lua(lua)?, + DataKey::Bytes(b) => Value::String(lua.create_string(b)?), }) } } diff --git a/yazi-shared/src/event/data.rs b/yazi-shared/src/event/data.rs index 089d19ec..a4432c5b 100644 --- a/yazi-shared/src/event/data.rs +++ b/yazi-shared/src/event/data.rs @@ -141,6 +141,8 @@ pub enum DataKey { Url(Url), #[serde(skip_deserializing)] Urn(UrnBuf), + #[serde(skip)] + Bytes(Vec), } impl DataKey {