refactor(json): clean up and simplify imports for clarity

This commit is contained in:
xiaoxigua-1 2025-05-01 15:58:01 +08:00
parent 5b0a5c9412
commit c7f7328f00
No known key found for this signature in database

View file

@ -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),