Passed
Push — main ( 2e6155...ac1e84 )
by Michael
03:13
created

FormatterServiceProvider::getFormatterName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
c 0
b 0
f 0
nc 1
nop 2
dl 0
loc 5
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace MichaelRubel\Formatters;
6
7
use Illuminate\Support\Facades\File;
8
use Illuminate\Support\Str;
9
use Spatie\LaravelPackageTools\Package;
10
use Spatie\LaravelPackageTools\PackageServiceProvider;
11
12
class FormatterServiceProvider extends PackageServiceProvider
13
{
14
    /**
15
     * Internal constants.
16
     *
17
     * @const
18
     */
19
    public const PACKAGE_FOLDER  = 'Collection';
20
    public const PACKAGE_CLASS   = 'Formatter';
21
    public const BINDING_POSTFIX = '_formatter';
22
    public const CLASS_SEPARATOR = '\\';
23
24
    /**
25
     * Configure the package.
26
     *
27
     * @param Package $package
28
     *
29
     * @return void
30
     */
31
    public function configurePackage(Package $package): void
32
    {
33
        $package
34
            ->name('laravel-formatters')
35
            ->hasConfigFile();
36
    }
37
38
    /**
39
     * Register any package services.
40
     *
41
     * @return void
42
     */
43
    public function packageRegistered(): void
44
    {
45
        $app_folder = config('formatters.folder')
46
            ?? 'app' . DIRECTORY_SEPARATOR . 'Formatters';
47
48
        $bindings_case = config('formatters.bindings_case')
49
            ?? 'snake';
50
51
        $appFormatters = app('files')->isDirectory($app_folder)
52
            ? collect(File::allFiles($app_folder))
53
            : collect();
54
55
        $packageFormatters = collect(
56
            File::allFiles(
57
                $this->getPackageBaseDir()
58
                . DIRECTORY_SEPARATOR
59
                . self::PACKAGE_FOLDER
60
            )
61
        );
62
63
        $packageFormatters
64
            ->merge($appFormatters)
65
            ->each(function ($file) use ($app_folder, $bindings_case) {
66
                $filename = $file->getFilenameWithoutExtension();
67
                $name = $this->getFormatterName($bindings_case, $filename);
68
                $class = $this->getFormatterClass($file, $filename, $app_folder);
69
70
                $this->app->bind($name, $class);
71
            });
72
    }
73
74
    /**
75
     * Returns formatter name for string binding.
76
     *
77
     * @param string $bindings_case
78
     * @param string $filename
79
     *
80
     * @return string
81
     */
82
    public function getFormatterName(string $bindings_case, string $filename): string
83
    {
84
        $name = str_replace('Formatter', '', $filename);
85
86
        return Str::{$bindings_case}($name . self::BINDING_POSTFIX);
87
    }
88
89
    /**
90
     * Determines the formatter class namespace.
91
     *
92
     * @param object $file
93
     * @param string $filename
94
     * @param string $app_folder
95
     *
96
     * @return string
97
     */
98
    private function getFormatterClass(object $file, string $filename, string $app_folder): string
99
    {
100
        $path = str_contains($file->getPathName(), $app_folder)
101
            ? Str::ucfirst(str_replace(DIRECTORY_SEPARATOR, self::CLASS_SEPARATOR, $app_folder))
102
              . self::CLASS_SEPARATOR
103
            : (new \ReflectionClass(static::class))->getNamespaceName()
104
              . self::CLASS_SEPARATOR
105
              . self::PACKAGE_FOLDER
106
              . self::CLASS_SEPARATOR;
107
108
        return sprintf(
109
            '%s%s',
110
            $path,
111
            $filename
112
        );
113
    }
114
}
115