From f16f149e83c2ee477904e8f21c9809ce7264c34c Mon Sep 17 00:00:00 2001
From: Mateusz Charytoniuk <mateusz.charytoniuk@protonmail.com>
Date: Tue, 6 Feb 2024 22:06:21 +0100
Subject: [PATCH] chore: validate mail

---
 src/Constraint/StringConstraint.php     | 26 +++++++++++++------------
 src/Constraint/StringConstraintTest.php |  8 ++++++++
 2 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/src/Constraint/StringConstraint.php b/src/Constraint/StringConstraint.php
index 4572046f..c66a46f4 100644
--- a/src/Constraint/StringConstraint.php
+++ b/src/Constraint/StringConstraint.php
@@ -86,24 +86,26 @@ final readonly class StringConstraint extends Constraint
             );
         }
 
-        if (ConstraintStringFormat::Uuid === $this->format) {
-            if (uuid_is_valid($notValidatedData)) {
-                return new ConstraintResult(
-                    castedData: $notValidatedData,
-                    path: $path,
-                    reason: ConstraintReason::Ok,
-                    status: ConstraintResultStatus::Valid,
-                );
-            }
+        $isFormatValid = match ($this->format) {
+            ConstraintStringFormat::Mail => false !== filter_var($notValidatedData, FILTER_VALIDATE_EMAIL),
+            ConstraintStringFormat::Uuid => uuid_is_valid($notValidatedData),
+            default => throw new RuntimeException('Unknown string format'),
+        };
 
+        if ($isFormatValid) {
             return new ConstraintResult(
                 castedData: $notValidatedData,
                 path: $path,
-                reason: ConstraintReason::InvalidFormat,
-                status: ConstraintResultStatus::Invalid,
+                reason: ConstraintReason::Ok,
+                status: ConstraintResultStatus::Valid,
             );
         }
 
-        throw new RuntimeException('Unknown string format');
+        return new ConstraintResult(
+            castedData: $notValidatedData,
+            path: $path,
+            reason: ConstraintReason::InvalidFormat,
+            status: ConstraintResultStatus::Invalid,
+        );
     }
 }
diff --git a/src/Constraint/StringConstraintTest.php b/src/Constraint/StringConstraintTest.php
index 9d6908a8..d5094e14 100644
--- a/src/Constraint/StringConstraintTest.php
+++ b/src/Constraint/StringConstraintTest.php
@@ -52,6 +52,14 @@ final class StringConstraintTest extends TestCase
         self::assertTrue($constraint->validate('hi')->status->isValid());
     }
 
+    public function test_validates_mail(): void
+    {
+        $constraint = new StringConstraint(format: ConstraintStringFormat::Mail);
+
+        self::assertFalse($constraint->validate('hi')->status->isValid());
+        self::assertTrue($constraint->validate('test@example.com')->status->isValid());
+    }
+
     public function test_validates_uuid(): void
     {
         $constraint = new StringConstraint(format: ConstraintStringFormat::Uuid);
-- 
GitLab