lthn.io/app/Core/Config/VersionDiff.php
Claude 41a90cbff8
feat: lthn.io API serving live chain data
Fixed: basePath self→static binding, namespace detection, event wiring,
SQLite cache, file cache driver. All Mod Boot classes converted to
$listens pattern for lifecycle event discovery.

Working endpoints:
- /v1/explorer/info — live chain height, difficulty, aliases
- /v1/explorer/stats — formatted chain statistics
- /v1/names/directory — alias directory grouped by type
- /v1/names/available/{name} — name availability check
- /v1/names/lookup/{name} — name details

Co-Authored-By: Charon <charon@lethean.io>
2026-04-03 17:17:42 +01:00

221 lines
5.1 KiB
PHP

<?php
/*
* Core PHP Framework
*
* Licensed under the European Union Public Licence (EUPL) v1.2.
* See LICENSE file for details.
*/
declare(strict_types=1);
namespace Core\Config;
/**
* Config version difference.
*
* Represents the difference between two config versions,
* tracking added, removed, and changed values.
*
* @see ConfigVersioning For version comparison
*/
class VersionDiff
{
/**
* Keys added in the new version.
*
* @var array<array{key: string, value: mixed}>
*/
protected array $added = [];
/**
* Keys removed in the new version.
*
* @var array<array{key: string, value: mixed}>
*/
protected array $removed = [];
/**
* Keys with changed values.
*
* @var array<array{key: string, old: mixed, new: mixed}>
*/
protected array $changed = [];
/**
* Keys with changed lock status.
*
* @var array<array{key: string, old: bool, new: bool}>
*/
protected array $lockChanged = [];
/**
* Add an added key.
*
* @param string $key The config key
* @param mixed $value The new value
*/
public function addAdded(string $key, mixed $value): void
{
$this->added[] = ['key' => $key, 'value' => $value];
}
/**
* Add a removed key.
*
* @param string $key The config key
* @param mixed $value The old value
*/
public function addRemoved(string $key, mixed $value): void
{
$this->removed[] = ['key' => $key, 'value' => $value];
}
/**
* Add a changed key.
*
* @param string $key The config key
* @param mixed $oldValue The old value
* @param mixed $newValue The new value
*/
public function addChanged(string $key, mixed $oldValue, mixed $newValue): void
{
$this->changed[] = ['key' => $key, 'old' => $oldValue, 'new' => $newValue];
}
/**
* Add a lock status change.
*
* @param string $key The config key
* @param bool $oldLocked Old lock status
* @param bool $newLocked New lock status
*/
public function addLockChanged(string $key, bool $oldLocked, bool $newLocked): void
{
$this->lockChanged[] = ['key' => $key, 'old' => $oldLocked, 'new' => $newLocked];
}
/**
* Get added keys.
*
* @return array<array{key: string, value: mixed}>
*/
public function getAdded(): array
{
return $this->added;
}
/**
* Get removed keys.
*
* @return array<array{key: string, value: mixed}>
*/
public function getRemoved(): array
{
return $this->removed;
}
/**
* Get changed keys.
*
* @return array<array{key: string, old: mixed, new: mixed}>
*/
public function getChanged(): array
{
return $this->changed;
}
/**
* Get lock status changes.
*
* @return array<array{key: string, old: bool, new: bool}>
*/
public function getLockChanged(): array
{
return $this->lockChanged;
}
/**
* Check if there are any differences.
*/
public function hasDifferences(): bool
{
return ! empty($this->added)
|| ! empty($this->removed)
|| ! empty($this->changed)
|| ! empty($this->lockChanged);
}
/**
* Check if there are no differences.
*/
public function isEmpty(): bool
{
return ! $this->hasDifferences();
}
/**
* Get total count of differences.
*/
public function count(): int
{
return count($this->added)
+ count($this->removed)
+ count($this->changed)
+ count($this->lockChanged);
}
/**
* Get summary string.
*/
public function getSummary(): string
{
if ($this->isEmpty()) {
return 'No differences';
}
$parts = [];
if (count($this->added) > 0) {
$parts[] = count($this->added).' added';
}
if (count($this->removed) > 0) {
$parts[] = count($this->removed).' removed';
}
if (count($this->changed) > 0) {
$parts[] = count($this->changed).' changed';
}
if (count($this->lockChanged) > 0) {
$parts[] = count($this->lockChanged).' lock changes';
}
return implode(', ', $parts);
}
/**
* Convert to array for JSON serialization.
*
* @return array<string, mixed>
*/
public function toArray(): array
{
return [
'has_differences' => $this->hasDifferences(),
'summary' => $this->getSummary(),
'added' => $this->added,
'removed' => $this->removed,
'changed' => $this->changed,
'lock_changed' => $this->lockChanged,
'counts' => [
'added' => count($this->added),
'removed' => count($this->removed),
'changed' => count($this->changed),
'lock_changed' => count($this->lockChanged),
'total' => $this->count(),
],
];
}
}