defaultDisk) === false) { throw new UnexpectedStorageException('Default disk does not exist'); } array_map( fn ($disk) => Utils::diskExists($disk) || throw new UnexpectedStorageException("Eligible disk {$disk} does not exist"), $this->eligibleDisks ); array_map( fn ($disk) => Utils::diskExists($disk->disk) || throw new UnexpectedStorageException("Laravel existing disk {$disk->disk} does not exist"), $this->laravelExistingDisks ); if (empty($this->laravelExistingDisks)) { throw new UnexpectedStorageException('Laravel existing disks cannot be empty'); } if (empty($this->eligibleDisks)) { throw new UnexpectedStorageException('Eligible disks cannot be empty'); } $intersect = array_intersect( $this->eligibleDisks, array_map(fn ($disk) => $disk->disk, $this->laravelExistingDisks) ); if (empty($intersect)) { throw new UnexpectedStorageException('No eligible disks exist in Laravel existing disks'); } $intersectWithDrivers = array_map( fn ($disk) => $disk, array_filter( $this->laravelExistingDisks, fn ($disk) => in_array($disk->disk, $intersect, true) ) ); $defaultDiskWithDriver = array_filter( $this->laravelExistingDisks, fn ($disk) => $disk->disk === $this->defaultDisk ); if (empty($defaultDiskWithDriver)) { throw new UnexpectedStorageException('Default disk does not exist in Laravel existing disks'); } $defaultDiskWithDriver = array_values($defaultDiskWithDriver)[0]; $this->default = new DiskName($defaultDiskWithDriver->disk, $defaultDiskWithDriver->driver); $this->eligibles = array_map(fn ($disk) => new DiskName( $disk->disk, $disk->driver ), $intersectWithDrivers); if (empty($this->allowedExtensions)) { throw new UnexpectedStorageException('Allowed extensions cannot be empty'); } foreach ($this->allowedExtensions as $extension) { if (! is_string($extension) || empty(mb_trim($extension))) { throw new UnexpectedStorageException("Allowed extension {$extension} is not valid"); } } } public function getDefaultDisk(): DiskName { return $this->default; } /** @return DiskName[] */ public function getEligiblesDisks(): array { return array_map(fn ($disk) => $disk, $this->eligibles); } public function isDiskEligible(DiskName | string $disk): bool { $diskName = $disk instanceof DiskName ? $disk->value : (string) $disk; foreach ($this->eligibles as $eligible) { if ($eligible->value === $diskName) { return true; } } return false; } public function isExtensionAllowed(string $extension): bool { return in_array( strtolower(ltrim($extension, '.')), array_map('strtolower', $this->allowedExtensions), true ); } /** @return string[] */ public function getAllowedExtensions(): array { return $this->allowedExtensions; } }