Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
86.67% covered (success)
86.67%
26 / 30
50.00% covered (warning)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
Validator
86.67% covered (success)
86.67%
26 / 30
50.00% covered (warning)
50.00%
1 / 2
7.12
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 execute
86.21% covered (success)
86.21%
25 / 29
0.00% covered (danger)
0.00%
0 / 1
6.09
1<?php
2
3/**
4 * @license MIT
5 * @author hazuki3417<hazuki3417@gmail.com>
6 * @copyright 2023 hazuki3417 all rights reserved.
7 */
8
9namespace Selen\File;
10
11use Selen\Bool\Util as BoolUtil;
12use Selen\File\Validate\Define;
13use Selen\File\Validate\Model\ValidateResult;
14use Selen\File\Validate\Model\ValidatorResult;
15
16class Validator
17{
18    /** @var Validate\Define[] */
19    private array $defines;
20
21    public function __construct(Define ...$defines)
22    {
23        $this->defines = $defines;
24    }
25
26    public function execute(string ...$filePaths): ValidatorResult
27    {
28        /** @var Validate\Model\ValidateResult[] */
29        $validResults = [];
30
31        foreach ($filePaths as $filePath) {
32            $validResult = new ValidateResult(false, $filePath);
33
34            if (!\file_exists($filePath)) {
35                $validResults[] = $validResult->setMessage('File does not exist.');
36                continue;
37            }
38
39            if (!\is_file($filePath)) {
40                $validResults[] = $validResult->setMessage('Specified path is not a file.');
41                continue;
42            }
43            $errMessages = [];
44            /**
45             * バリデーション結果をスタックする変数
46             * サイズ・拡張子制限のバリデーションを合格しているDefine::makeが1つ以上存在する場合は
47             * バリデーション合格となる。
48             */
49            $specValidResults = [];
50
51            foreach ($this->defines as $define) {
52                $specValidResults[] = BoolUtil::allTrue(
53                    $define->isAllowExtension($filePath),
54                    $define->isUnderSizeLimit($filePath),
55                );
56                $errMessages[] = \sprintf(
57                    '%s(%s)',
58                    $define->getLimitSize(),
59                    \implode('|', $define->getAllowExtensions())
60                );
61            }
62
63            if (BoolUtil::allFalse(...$specValidResults)) {
64                // バリデーションがすべて不合格だったとき
65                $mes = \sprintf(
66                    'Invalid file. Maximum file size and supported extensions %s.',
67                    \implode(', ', $errMessages)
68                );
69                $validResults[] = $validResult->setMessage($mes);
70                continue;
71            }
72            // バリデーションが1つでも合格だったときは何もしない
73        }
74        return new ValidatorResult(...$validResults);
75    }
76}