1: <?php
2:
3: /**
4: * This file is part of expect package.
5: *
6: * (c) Noritaka Horio <holy.shared.design@gmail.com>
7: *
8: * This source file is subject to the MIT license that is bundled
9: * with this source code in the file LICENSE.
10: */
11: namespace expect;
12:
13: /**
14: * Message when validation fails.
15: *
16: * @author Noritaka Horio <holy.shared.design@gmail.com>
17: * @copyright Noritaka Horio <holy.shared.design@gmail.com>
18: */
19: class FailedMessage implements Message
20: {
21: /**
22: * @var string
23: */
24: private $message;
25:
26: /**
27: * @param string $message
28: */
29: public function __construct($message = '')
30: {
31: $this->message = $message;
32: }
33:
34: /**
35: * Append the text to the last.
36: *
37: * @param mixed $value
38: *
39: * @return $this
40: */
41: public function appendText($value)
42: {
43: $text = $this->stringify($value);
44: $this->message = $this->message . $text;
45:
46: return $this;
47: }
48:
49: /**
50: * Append the length space.
51: *
52: * @param int $length
53: *
54: * @return $this
55: */
56: public function appendSpace($length)
57: {
58: $paddingLength = (int) $length;
59: $this->message = $this->message . str_pad('', $paddingLength, ' ');
60:
61: return $this;
62: }
63:
64: /**
65: * Append the value to the last.
66: *
67: * @param mixed $value
68: *
69: * @return $this
70: */
71: public function appendValue($value)
72: {
73: $appendValue = $this->formatValue($value);
74: $this->message = $this->message . $appendValue;
75:
76: return $this;
77: }
78:
79: /**
80: * Append the values to the last.
81: *
82: * @param array $values
83: *
84: * @return $this
85: */
86: public function appendValues(array $values)
87: {
88: $appendValues = [];
89:
90: foreach ($values as $value) {
91: $appendValues[] = $this->formatValue($value);
92: }
93:
94: $this->message = $this->message . implode(', ', $appendValues);
95:
96: return $this;
97: }
98:
99: public function concat(FailedMessage $message)
100: {
101: $prefix = (string) $this;
102: $suffix = (string) $message;
103: $concatenatedMessage = trim($prefix) . "\n" . trim($suffix);
104:
105: return static::fromString($concatenatedMessage);
106: }
107:
108: public static function fromString($value)
109: {
110: return new self($value);
111: }
112:
113: private function boolToString($value)
114: {
115: return $value === true ? 'true' : 'false';
116: }
117:
118: public function __toString()
119: {
120: return $this->message;
121: }
122:
123: private function formatValue($value)
124: {
125: $text = $this->stringify($value);
126:
127: if (is_string($value)) {
128: $text = "'" . $text . "'";
129: }
130:
131: return $text;
132: }
133:
134: private function stringify($value)
135: {
136: $appendValue = $value;
137:
138: if (is_null($value)) {
139: $appendValue = 'null';
140: } else if (is_bool($value)) {
141: $appendValue = $this->boolToString($value);
142: } else if (is_string($value) === false) {
143: $appendValue = rtrim(print_r($value, true));
144: }
145:
146: return $appendValue;
147: }
148: }
149: