Passed
Push — main ( c6b105...31af8b )
by Thierry
07:02
created

MetadataCache::save()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 9
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 13
rs 9.9666
1
<?php
2
3
/**
4
 * Cache.php
5
 *
6
 * Cache for callable class metadata.
7
 *
8
 * @package jaxon-core
9
 * @author Thierry Feuzeu <[email protected]>
10
 * @copyright 2024 Thierry Feuzeu <[email protected]>
11
 * @license https://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License
12
 * @link https://github.com/jaxon-php/jaxon-core
13
 */
14
15
namespace Jaxon\App\Metadata;
16
17
use function is_callable;
18
use function str_replace;
19
use function strtolower;
20
21
class MetadataCache
22
{
23
    /**
24
     * @param string $sCacheDir
25
     */
26
    public function __construct(private string $sCacheDir)
27
    {}
28
29
    /**
30
     * @param string $sClass
31
     *
32
     * @return string
33
     */
34
    private function filename(string $sClass): string
35
    {
36
        $sName = str_replace(['\\', '.'], '_', strtolower($sClass));
37
        return "{$this->sCacheDir}/{$sName}.php";
38
    }
39
40
    /**
41
     * @param string $sClass
42
     * @param Metadata $xMetadata
43
     *
44
     * @return void
45
     */
46
    public function save(string $sClass, Metadata $xMetadata): void
47
    {
48
        $sFilename = $this->filename($sClass);
49
        $sDataCode = implode("\n    ", $xMetadata->encode());
50
        $sPhpCode = <<<CODE
51
<?php
52
53
return function() {
54
    $sDataCode
55
};
56
57
CODE;
58
        file_put_contents($sFilename, $sPhpCode);
59
    }
60
61
    /**
62
     * @param string $sClass
63
     *
64
     * @return Metadata|null
65
     */
66
    public function read(string $sClass): ?Metadata
67
    {
68
        $fFunction = require $this->filename($sClass);
69
        return !is_callable($fFunction) ? null : $fFunction();
70
    }
71
}
72