From 0bd0c361297903888c1f53af67d547ef2858882f Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 5 Jun 2026 05:10:50 +0900 Subject: refactor(json): make json encode helpers accept serde::Serialize Change json_encode/json_encode_ex and JsonFile::encode/encode_with_options to take a generic serde::Serialize value instead of &PhpMixed, implement Serialize for PhpMixed/ArrayObject, and drop the PhpMixed::String wrapping at JsonManipulator call sites in favor of passing raw values. Co-Authored-By: Claude Opus 4.8 (1M context) --- crates/shirabe-php-shim/src/lib.rs | 49 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'crates/shirabe-php-shim/src/lib.rs') diff --git a/crates/shirabe-php-shim/src/lib.rs b/crates/shirabe-php-shim/src/lib.rs index cb487a2..77e51ac 100644 --- a/crates/shirabe-php-shim/src/lib.rs +++ b/crates/shirabe-php-shim/src/lib.rs @@ -13,6 +13,51 @@ pub enum PhpMixed { Object(ArrayObject), } +impl serde::Serialize for PhpMixed { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::{SerializeMap, SerializeSeq}; + match self { + PhpMixed::Null => serializer.serialize_none(), + PhpMixed::Bool(b) => serializer.serialize_bool(*b), + PhpMixed::Int(i) => serializer.serialize_i64(*i), + PhpMixed::Float(f) => serializer.serialize_f64(*f), + PhpMixed::String(s) => serializer.serialize_str(s), + PhpMixed::List(items) => { + let mut seq = serializer.serialize_seq(Some(items.len()))?; + for item in items { + seq.serialize_element(item)?; + } + seq.end() + } + PhpMixed::Array(entries) => { + let mut map = serializer.serialize_map(Some(entries.len()))?; + for (k, v) in entries { + map.serialize_entry(k, v)?; + } + map.end() + } + PhpMixed::Object(object) => object.serialize(serializer), + } + } +} + +impl serde::Serialize for ArrayObject { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::SerializeMap; + let mut map = serializer.serialize_map(Some(self.data.len()))?; + for (k, v) in &self.data { + map.serialize_entry(k, v)?; + } + map.end() + } +} + impl PhpMixed { pub fn as_bool(&self) -> Option { match self { @@ -815,7 +860,7 @@ pub const JSON_UNESCAPED_SLASHES: i64 = 64; pub const JSON_PRETTY_PRINT: i64 = 128; pub const JSON_THROW_ON_ERROR: i64 = 4194304; -pub fn json_encode(_value: &PhpMixed) -> Option { +pub fn json_encode(_value: &T) -> Option { todo!() } @@ -1078,7 +1123,7 @@ pub fn random_int(_min: i64, _max: i64) -> i64 { todo!() } -pub fn json_encode_ex(_value: &PhpMixed, _flags: i64) -> Option { +pub fn json_encode_ex(_value: &T, _flags: i64) -> Option { todo!() } -- cgit v1.3.1