diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-21 18:49:24 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-21 18:52:05 +0900 |
| commit | a3171eefd8f8e520329bdd8f613e83ba6f0a7c13 (patch) | |
| tree | 195599a0c46b97349f017b97e965e4b4c1794f36 /crates/shirabe/src/json/json_manipulator.rs | |
| parent | e24bf7e3b6b16a77c2eaeae9ba7b453f5138ff25 (diff) | |
| download | php-shirabe-a3171eefd8f8e520329bdd8f613e83ba6f0a7c13.tar.gz php-shirabe-a3171eefd8f8e520329bdd8f613e83ba6f0a7c13.tar.zst php-shirabe-a3171eefd8f8e520329bdd8f613e83ba6f0a7c13.zip | |
refactor(php-shim): remove ArrayObject, inline IndexMap into PhpMixed::Object
ArrayObject was only a thin wrapper around IndexMap<String, PhpMixed>
used as an empty-{} vs empty-[] marker and as the assoc=false JSON
object representation; no reference semantics were involved. Inline its
payload directly into PhpMixed::Object and drop the type along with the
now-dead StdClass.
Side effects of the unification:
- ArrayObject::new was todo!(); the config --global / object-typed get
paths that built PhpMixed::Object(ArrayObject::new(None)) no longer
panic.
- base_config_command wrote 'config' as PhpMixed::Array(empty), emitting
[] instead of {}; now matches PHP's new \ArrayObject ({}).
- The dead is::<StdClass>()/is::<ArrayObject>() instanceof checks in
JsonManipulator are replaced with the faithful as_object() mapping.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/json/json_manipulator.rs')
| -rw-r--r-- | crates/shirabe/src/json/json_manipulator.rs | 47 |
1 files changed, 18 insertions, 29 deletions
diff --git a/crates/shirabe/src/json/json_manipulator.rs b/crates/shirabe/src/json/json_manipulator.rs index 904ea7a..30ceedb 100644 --- a/crates/shirabe/src/json/json_manipulator.rs +++ b/crates/shirabe/src/json/json_manipulator.rs @@ -4,10 +4,10 @@ use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; use shirabe_php_shim::{ - ArrayObject, InvalidArgumentException, LogicException, PhpMixed, StdClass, addcslashes, - array_key_exists, array_keys, array_reverse, count, empty, explode, implode, in_array, - is_array, is_int, is_numeric, json_decode, preg_quote, rtrim, str_contains, str_repeat, - str_replace, strlen, strnatcmp, strpos, substr, trim, uksort, + InvalidArgumentException, LogicException, PhpMixed, addcslashes, array_key_exists, array_keys, + array_reverse, count, empty, explode, implode, in_array, is_array, is_int, is_numeric, + json_decode, preg_quote, rtrim, str_contains, str_repeat, str_replace, strlen, strnatcmp, + strpos, substr, trim, uksort, }; use crate::json::JsonFile; @@ -254,17 +254,17 @@ impl JsonManipulator { let repositories_value: Option<PhpMixed> = decoded .as_object() - .and_then(|o| o.to_array().get("repositories").cloned()); + .and_then(|o| o.get("repositories").cloned()); let is_std_class = repositories_value .as_ref() - .map(|v| (v as &dyn std::any::Any).is::<StdClass>()) + .map(|v| v.as_object().is_some()) .unwrap_or(false); if is_std_class { // delete from bottom to top, to ensure keys stay the same let repos_arr: IndexMap<String, PhpMixed> = repositories_value .as_ref() - .and_then(|v| v.as_array().cloned()) + .and_then(|v| v.as_object().cloned()) .unwrap_or_default(); let entries_to_revert: Vec<String> = array_reverse(&array_keys(&repos_arr), false); @@ -278,7 +278,7 @@ impl JsonManipulator { // re-add in order for (repository_name, repository) in &repos_arr { - let is_obj = (repository as &dyn std::any::Any).is::<StdClass>(); + let is_obj = repository.as_object().is_some(); if !is_obj { let mut m: IndexMap<String, PhpMixed> = IndexMap::new(); m.insert(repository_name.clone(), repository.clone()); @@ -494,15 +494,15 @@ impl JsonManipulator { let decoded = json_decode(&self.contents, false)?; let repositories_value: Option<PhpMixed> = decoded .as_object() - .and_then(|o| o.to_array().get("repositories").cloned()); + .and_then(|o| o.get("repositories").cloned()); let is_assoc = repositories_value .as_ref() - .map(|v| (v as &dyn std::any::Any).is::<StdClass>()) + .map(|v| v.as_object().is_some()) .unwrap_or(false); let repos: IndexMap<String, PhpMixed> = repositories_value .as_ref() - .and_then(|v| v.as_array().cloned()) + .and_then(|v| v.as_object().cloned()) .unwrap_or_default(); for (repository_index, repository) in &repos { @@ -516,7 +516,7 @@ impl JsonManipulator { let repo_name_owned: Option<String> = repository .as_object() - .and_then(|o| o.to_array().get("name").cloned()) + .and_then(|o| o.get("name").cloned()) .and_then(|v| v.as_string().map(|s| s.to_string())); if Some(name) == repo_name_owned.as_deref() { if is_assoc { @@ -996,7 +996,7 @@ impl JsonManipulator { .map(|a| a.is_empty()) .unwrap_or(false); if now_empty { - arr.insert(name_owned.clone(), PhpMixed::Object(ArrayObject::new(None))); + arr.insert(name_owned.clone(), PhpMixed::Object(IndexMap::new())); } } let val = cur_val @@ -1042,10 +1042,7 @@ impl JsonManipulator { .map(|a| a.is_empty()) .unwrap_or(false); if now_empty { - arr.insert( - name_capture.clone(), - PhpMixed::Object(ArrayObject::new(None)), - ); + arr.insert(name_capture.clone(), PhpMixed::Object(IndexMap::new())); } } children_clean = formatter.format(&cur_val, 0, true).unwrap_or_default(); @@ -1565,13 +1562,9 @@ impl JsonManipulator { pub fn format(&self, data: &PhpMixed, depth: i64, was_object: bool) -> anyhow::Result<String> { let mut data = data.clone(); let mut was_object = was_object; - if (&data as &dyn std::any::Any).is::<StdClass>() - || (&data as &dyn std::any::Any).is::<ArrayObject>() - { + if let Some(obj) = data.as_object() { // PHP: (array) $data — coerce to array - if let Some(obj) = data.as_object() { - data = PhpMixed::Array(obj.to_array().into_iter().collect()); - } + data = PhpMixed::Array(obj.clone()); was_object = true; } @@ -1639,12 +1632,8 @@ impl ManipulatorFormatter { fn format(&self, data: &PhpMixed, depth: i64, was_object: bool) -> anyhow::Result<String> { let mut data = data.clone(); let mut was_object = was_object; - if (&data as &dyn std::any::Any).is::<StdClass>() - || (&data as &dyn std::any::Any).is::<ArrayObject>() - { - if let Some(obj) = data.as_object() { - data = PhpMixed::Array(obj.to_array().into_iter().collect()); - } + if let Some(obj) = data.as_object() { + data = PhpMixed::Array(obj.clone()); was_object = true; } |
