Lines 100.00% 11 / 11
Methods 100.00% 5 / 5
Classes 100.00% 1 / 1
Name Lines Methods CRAP
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 defaultMessage 100.00% 1 / 1 100.00% 1 / 1 1
 validate 100.00% 1 / 1 100.00% 1 / 1 1
 [Lucent\Validation\Constraint] withMessage 100.00% 2 / 2 100.00% 1 / 1 1
 [Lucent\Validation\Constraint] message 100.00% 6 / 6 100.00% 1 / 1 3
22final class SameAs extends Constraint
23{
24    /**
25     * Create a constraint requiring a field to match another field.
26     *
27     * @param string $otherField The name of the field to compare against.
28     */
29    public function __construct(private readonly string $otherField) {}
30
31    /**
32     * @return string|Closure(FieldContext): string The default error message.
33     */
34    #[Override]
35    protected function defaultMessage(): string|Closure|null
36    {
37        return fn(FieldContext $ctx) => "{$ctx->field} must match the value of {$this->otherField}";
38    }
39
40    /**
41     * Validate that the value strictly equals the other field's value.
42     *
43     * @param FieldContext $ctx The context of the field being validated.
44     * @return bool True if the values match, false otherwise.
45     */
46    #[Override]
47    public function validate(FieldContext $ctx): bool
48    {
49        return $ctx->value === $ctx->valueOf($this->otherField);
50    }
51}

Inherited from Lucent\Validation\Constraint

38    final public function withMessage(string|\Closure $message): static
39    {
40        $this->customMessage = $message;
41        return $this;
42    }
56    final public function message(FieldContext $ctx): ?string
57    {
58        $message = $this->customMessage ?? $this->defaultMessage();
59
60        if ($message === null) {
61            return null;
62        }
63
64        if ($message instanceof \Closure) {
65            return call_user_func($message, $ctx);
66        }
67
68        return $message;
69    }