Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 69
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
AliasAutoloader
0.00% covered (danger)
0.00%
0 / 68
0.00% covered (danger)
0.00%
0 / 6
420
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 autoload
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
42
 load
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 classTemplate
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
30
 interfaceTemplate
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
12
 traitTemplate
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3// FunctionsAndConstants
4
5namespace BrianHenryIE\Strauss {
6
7    use BrianHenryIE\Strauss\Types\AutoloadAliasInterface;
8
9    /**
10     * @see AutoloadAliasInterface
11     *
12     * @phpstan-type ClassAliasArray array{'type':'class',isabstract:bool,classname:string,namespace?:string,extends:string,implements:array<string>}
13     * @phpstan-type InterfaceAliasArray array{'type':'interface',interfacename:string,namespace?:string,extends:array<string>}
14     * @phpstan-type TraitAliasArray array{'type':'trait',traitname:string,namespace?:string,use:array<string>}
15     * @phpstan-type AutoloadAliasArray array<string,ClassAliasArray|InterfaceAliasArray|TraitAliasArray>
16     */
17    class AliasAutoloader
18    {
19        private string $includeFilePath;
20
21        /**
22         * @var AutoloadAliasArray
23         */
24        private array $autoloadAliases = [];
25
26        public function __construct()
27        {
28            $this->includeFilePath = __DIR__ . '/autoload_alias.php';
29        }
30
31        /**
32         * @param string $class
33         */
34        public function autoload($class): void
35        {
36            if (!isset($this->autoloadAliases[$class])) {
37                return;
38            }
39            switch ($this->autoloadAliases[$class]['type']) {
40                case 'class':
41                        $this->load(
42                            $this->classTemplate(
43                                $this->autoloadAliases[$class]
44                            )
45                        );
46                    break;
47                case 'interface':
48                    $this->load(
49                        $this->interfaceTemplate(
50                            $this->autoloadAliases[$class]
51                        )
52                    );
53                    break;
54                case 'trait':
55                    $this->load(
56                        $this->traitTemplate(
57                            $this->autoloadAliases[$class]
58                        )
59                    );
60                    break;
61                default:
62                    // Never.
63                    break;
64            }
65        }
66
67        private function load(string $includeFile): void
68        {
69            file_put_contents($this->includeFilePath, $includeFile);
70            include $this->includeFilePath;
71            file_exists($this->includeFilePath) && unlink($this->includeFilePath);
72        }
73
74        /**
75         * @param ClassAliasArray $class
76         */
77        private function classTemplate(array $class): string
78        {
79            $abstract = $class['isabstract'] ? 'abstract ' : '';
80            $classname = $class['classname'];
81            if (isset($class['namespace'])) {
82                $namespace = "namespace {$class['namespace']};";
83                $extends = '\\' . $class['extends'];
84                $implements = empty($class['implements']) ? ''
85                : ' implements \\' . implode(', \\', $class['implements']);
86            } else {
87                $namespace = '';
88                $extends = $class['extends'];
89                $implements = !empty($class['implements']) ? ''
90                : ' implements ' . implode(', ', $class['implements']);
91            }
92            return <<<EOD
93                <?php
94                $namespace
95                $abstract class $classname extends $extends $implements {}
96                EOD;
97        }
98
99        /**
100         * @param InterfaceAliasArray $interface
101         */
102        private function interfaceTemplate(array $interface): string
103        {
104            $interfacename = $interface['interfacename'];
105            $namespace = isset($interface['namespace'])
106            ? "namespace {$interface['namespace']};" : '';
107            $extends = isset($interface['namespace'])
108            ? '\\' . implode('\\ ,', $interface['extends'])
109            : implode(', ', $interface['extends']);
110            return <<<EOD
111                <?php
112                $namespace
113                interface $interfacename extends $extends {}
114                EOD;
115        }
116
117        /**
118         * @param TraitAliasArray $trait
119         */
120        private function traitTemplate(array $trait): string
121        {
122            $traitname = $trait['traitname'];
123            $namespace = isset($trait['namespace'])
124            ? "namespace {$trait['namespace']};" : '';
125            $uses = isset($trait['namespace'])
126            ? '\\' . implode(';' . PHP_EOL . '    use \\', $trait['use'])
127            : implode(';' . PHP_EOL . '    use ', $trait['use']);
128            return <<<EOD
129                <?php
130                $namespace
131                trait $traitname { 
132                    use $uses
133                }
134                EOD;
135        }
136    }
137
138    spl_autoload_register([ new AliasAutoloader(), 'autoload' ]);
139}