mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
refactor(json): clean up and simplify imports for clarity
This commit is contained in:
parent
5b0a5c9412
commit
c7f7328f00
1 changed files with 16 additions and 14 deletions
|
|
@ -1,8 +1,11 @@
|
||||||
use mlua::{
|
use mlua::{
|
||||||
Function, IntoLuaMulti, Lua, LuaSerdeExt, MetaMethod, UserData, UserDataMethods, Value,
|
Error as MluaError, Function, IntoLuaMulti, Lua, LuaSerdeExt, MetaMethod, UserData,
|
||||||
|
UserDataFields, UserDataMethods, Value,
|
||||||
};
|
};
|
||||||
|
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
use serde::Serializer;
|
||||||
|
use serde::ser::Error as SerdeError;
|
||||||
use serde_json::value::Value as JsonValue;
|
use serde_json::value::Value as JsonValue;
|
||||||
|
|
||||||
use std::cell::{Ref, RefCell, RefMut};
|
use std::cell::{Ref, RefCell, RefMut};
|
||||||
|
|
@ -28,7 +31,7 @@ struct OrderedTable {
|
||||||
impl Serialize for OrderedTable {
|
impl Serialize for OrderedTable {
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
where
|
where
|
||||||
S: serde::Serializer,
|
S: Serializer,
|
||||||
{
|
{
|
||||||
use OrderedTableIndex::*;
|
use OrderedTableIndex::*;
|
||||||
let current = self.data.borrow();
|
let current = self.data.borrow();
|
||||||
|
|
@ -37,14 +40,13 @@ impl Serialize for OrderedTable {
|
||||||
for index in &self.path {
|
for index in &self.path {
|
||||||
match index {
|
match index {
|
||||||
Key(key) => {
|
Key(key) => {
|
||||||
value = value
|
value =
|
||||||
.get(key)
|
value.get(key).ok_or_else(|| SerdeError::custom(format!("Key '{}' not found", key)))?;
|
||||||
.ok_or_else(|| serde::ser::Error::custom(format!("Key '{}' not found", key)))?;
|
|
||||||
}
|
}
|
||||||
Index(i) => {
|
Index(i) => {
|
||||||
value = value
|
value = value
|
||||||
.get(*i)
|
.get(*i)
|
||||||
.ok_or_else(|| serde::ser::Error::custom(format!("Index {} out of bounds", i)))?;
|
.ok_or_else(|| SerdeError::custom(format!("Index {} out of bounds", i)))?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -106,7 +108,7 @@ impl OrderedTable {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UserData for OrderedTable {
|
impl UserData for OrderedTable {
|
||||||
fn add_fields<F: mlua::UserDataFields<Self>>(fields: &mut F) {
|
fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
|
||||||
fields.add_meta_field("__ordered", true);
|
fields.add_meta_field("__ordered", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -137,7 +139,7 @@ impl UserData for OrderedTable {
|
||||||
|
|
||||||
methods.add_meta_method_mut(MetaMethod::Pairs, |lua, this: &mut OrderedTable, ()| {
|
methods.add_meta_method_mut(MetaMethod::Pairs, |lua, this: &mut OrderedTable, ()| {
|
||||||
let curr =
|
let curr =
|
||||||
this.get_current_mut().ok_or_else(|| mlua::Error::RuntimeError("invalid path".into()))?;
|
this.get_current_mut().ok_or_else(|| MluaError::RuntimeError("invalid path".into()))?;
|
||||||
|
|
||||||
let keys = match &*curr {
|
let keys = match &*curr {
|
||||||
JsonValue::Object(obj) => {
|
JsonValue::Object(obj) => {
|
||||||
|
|
@ -188,28 +190,28 @@ impl UserData for OrderedTable {
|
||||||
methods.add_meta_method_mut(
|
methods.add_meta_method_mut(
|
||||||
MetaMethod::NewIndex,
|
MetaMethod::NewIndex,
|
||||||
|_, this: &mut OrderedTable, (key, value): (Value, Value)| {
|
|_, this: &mut OrderedTable, (key, value): (Value, Value)| {
|
||||||
let value = serde_json::to_value(value).map_err(mlua::Error::external)?;
|
let value = serde_json::to_value(value).map_err(MluaError::external)?;
|
||||||
let mut curr =
|
let mut curr =
|
||||||
this.get_current_mut().ok_or_else(|| mlua::Error::RuntimeError("invalid path".into()))?;
|
this.get_current_mut().ok_or_else(|| MluaError::RuntimeError("invalid path".into()))?;
|
||||||
|
|
||||||
match &mut *curr {
|
match &mut *curr {
|
||||||
JsonValue::Object(obj) => {
|
JsonValue::Object(obj) => {
|
||||||
let k = key
|
let k = key
|
||||||
.as_str()
|
.as_str()
|
||||||
.ok_or_else(|| mlua::Error::RuntimeError("object key must be string".into()))?;
|
.ok_or_else(|| MluaError::RuntimeError("object key must be string".into()))?;
|
||||||
obj.insert(k.to_string(), value);
|
obj.insert(k.to_string(), value);
|
||||||
}
|
}
|
||||||
JsonValue::Array(arr) => {
|
JsonValue::Array(arr) => {
|
||||||
let i = key
|
let i = key
|
||||||
.as_integer()
|
.as_integer()
|
||||||
.ok_or_else(|| mlua::Error::RuntimeError("array index must be integer".into()))?;
|
.ok_or_else(|| MluaError::RuntimeError("array index must be integer".into()))?;
|
||||||
let idx = (i - 1) as usize;
|
let idx = (i - 1) as usize;
|
||||||
if idx < arr.len() {
|
if idx < arr.len() {
|
||||||
arr[idx] = value;
|
arr[idx] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
return Err(mlua::Error::RuntimeError("not an object or array".into()));
|
return Err(MluaError::RuntimeError("not an object or array".into()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -226,7 +228,7 @@ impl Utils {
|
||||||
Value::UserData(ud) => {
|
Value::UserData(ud) => {
|
||||||
let table = ud
|
let table = ud
|
||||||
.borrow::<OrderedTable>()
|
.borrow::<OrderedTable>()
|
||||||
.map_err(|_| mlua::Error::RuntimeError("Unknown userdata type".into()))?;
|
.map_err(|_| MluaError::RuntimeError("Unknown userdata type".into()))?;
|
||||||
serde_json::to_string(&*table).map_err(Error::Serde)
|
serde_json::to_string(&*table).map_err(Error::Serde)
|
||||||
}
|
}
|
||||||
_ => serde_json::to_string(&value).map_err(Error::Serde),
|
_ => serde_json::to_string(&value).map_err(Error::Serde),
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue