Field::__construct()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 6
ccs 5
cts 5
cp 1
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 2
1
<?php
2
3
namespace Logikos\Util\Config\Field;
4
5
use Logikos\Util\Config\Field as FieldInterface;
6
use Logikos\Util\Validation;
7
use Logikos\Util\Validation\Validator;
8
use Logikos\Util\Validation\Result;
9
10
class Field implements FieldInterface {
11
12
  protected $name;
13
14
  /** @var Validation */
15
  protected $validation;
16
17 25
  public function __construct($name) {
18 25
    if (!$this->isValidName($name))
19 1
      throw new InvalidFieldNameException();
20 24
    $this->name = $name;
21
22 24
    $this->validation = new Validation();
23 24
  }
24
25 6
  public static function withValidators($name, Validator ...$validators) {
26 6
    $field = new static($name);
27 6
    $field->validation->addValidator(...$validators);
28 6
    return $field;
29
  }
30
31 15
  public function isRequired() : bool {
32 15
    return true;
33
  }
34
35 8
  public function getName() {
36 8
    return $this->name;
37
  }
38
39 19
  public function validate($value): Result {
40 19
    return $this->isRequired()
41 14
        ? $this->validateRequired($value)
42 19
        : $this->validateOptional($value);
43
  }
44
45 14
  protected function validateRequired($value): Result {
46 14
    $result = $this->validationResult($value);
47
48 14
    return $result->isValid() && $this->isEmpty($value)
49 3
        ? $this->invalidResult(['Required'])
50 14
        : $result;
51
  }
52
53 10
  protected function validateOptional($value): Result {
54 10
    return $this->isEmpty($value)
55 9
        ? new Validation\ValidResult()
56 10
        : $this->validationResult($value);
57
  }
58
59 17
  protected function validationResult($value): Result {
60 17
    return $this->validation->validate($value);
61
  }
62
63 3
  protected function invalidResult($messages) {
64 3
    return new Validation\InvalidResult($messages);
65
  }
66
67 10
  public function addValidator(Validator ...$validator) {
68 10
    $this->validation->addValidator(...$validator);
69 10
  }
70
71 7
  public function addPattern($pattern, $description) {
72 7
    $this->addValidator(new Validator\Regex($pattern, $description));
73 6
  }
74
75 6
  public function addCallable(callable $callable, $description) {
76 6
    $this->addValidator(new Validator\Callback($callable, $description));
77 6
  }
78
79 14
  protected function isEmpty($value) {
80 14
    return is_null($value) || $value === '';
81
  }
82
83 25
  private function isValidName($name) {
84 25
    return is_int($name)
85 25
        || is_string($name)
86 25
        && !empty($name);
87
  }
88
}