Files
duckbrain-toolbox/packages/commands/src/Toolbox/Catalog.php
T
2026-10-05 15:08:39 -03:00

54 lines
1.2 KiB
PHP

<?php
namespace Toolbox;
/**
* Catálogo de paquetes descubiertos en un directorio `packages/`.
*/
final class Catalog
{
/** @var array<string, Manifest>|null */
private ?array $cache = null;
public function __construct(private readonly string $packagesDir)
{
}
public static function fromRoot(string $root): self
{
return new self(rtrim($root, '/') . '/packages');
}
/** @return array<string, Manifest> */
public function packages(): array
{
if ($this->cache !== null) {
return $this->cache;
}
$packages = [];
foreach (glob($this->packagesDir . '/*/duckbrain.json') ?: [] as $manifestPath) {
$manifest = Manifest::fromFile($manifestPath);
$packages[$manifest->name] = $manifest;
}
ksort($packages);
return $this->cache = $packages;
}
public function has(string $name): bool
{
return isset($this->packages()[$name]);
}
public function get(string $name): Manifest
{
if (!$this->has($name)) {
throw new ToolboxException("Paquete desconocido en el catálogo: '{$name}'");
}
return $this->packages()[$name];
}
}