Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
PathGenerator
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
2 / 2
4
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 execute
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3/**
4 * @license MIT
5 * @author hazuki3417<hazuki3417@gmail.com>
6 * @copyright 2023 hazuki3417 all rights reserved.
7 */
8
9namespace Selen\PSR4\Generator;
10
11use Selen\PSR4\Constants;
12use Selen\PSR4\Generator\Result\NamespaceResult;
13use Selen\PSR4\Generator\Result\PathResult;
14use Selen\PSR4\Map;
15
16/**
17 * 名前空間からパスを生成するクラスです
18 */
19class PathGenerator implements Constants
20{
21    /**
22     * @var Map[] 名前空間のprefixとbase directoryのマッピング情報
23     */
24    private readonly array $maps;
25
26    public function __construct(Map ...$maps)
27    {
28        $this->maps = $maps;
29    }
30
31    public function execute(string $namespace): Result
32    {
33        $conversionChar = $namespace;
34
35        // マッピング情報に基づいてパスを置換
36        foreach ($this->maps as $map) {
37            /**
38             * NOTE: 一番最初にマッチしたものを使う。
39             *       複数マッチするケースがある場合は引数の指定順を工夫すること。
40             */
41            if ($map->matchNamespacePrefix($conversionChar)) {
42                $conversionChar = \str_replace(
43                    $map->namespacePrefix,
44                    $map->baseDirectory,
45                    $conversionChar
46                );
47                break;
48            }
49        }
50
51        // 区切り文字を置換(namespace -> path)
52        $conversionChar = \str_replace(self::DELIMITER_NAMESPACE, self::DELIMITER_PATH, $conversionChar);
53
54        // 拡張子を追加
55        $path = $conversionChar . self::EXTENSION_PHP;
56
57        // 区切り文字で単語に分割(名前空間)
58        $words = \explode(self::DELIMITER_NAMESPACE, $namespace);
59
60        $namespace = new NamespaceResult(
61            $namespace,
62            \implode(self::DELIMITER_NAMESPACE, \array_slice($words, 0, -1)),
63            \array_slice($words, -1)[0],
64        );
65
66        $path = new PathResult(
67            $path,
68            \dirname($path),
69            \basename($path),
70        );
71        return new Result($namespace, $path);
72    }
73}