@@ -1,19 +1,23 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2+{-# OPTIONS_GHC -Wno-orphans #-}
2module Text.Email.Extra
3module Text.Email.Extra
3 ( validateEmail
4 ( validateEmail
4 , emailToText
5 , emailToText
7−import Control.Monad ((<=<))
8+import Control.Monad ((<=<))
8−import Data.ByteString (ByteString)
9+import Data.ByteString (ByteString)
10+import qualified Data.ByteString.Char8 as BSC
9−import Data.Text (Text)
11+import Data.Text (Text)
10−import Data.Text as T (unpack)
12+import Data.Text as T (unpack)
11−import Data.Text.Encoding as T (decodeUtf8)
13+import Data.Text.Encoding as T (decodeUtf8)
14+import Test.QuickCheck
12−import Text.Email.Validate (EmailAddress)
15+import Text.Email.Validate (EmailAddress)
13−import Text.Email.Validate as Email (validate, domainPart, toByteString)
16+import Text.Email.Validate as Email
17+ (domainPart, toByteString, unsafeEmailAddress, validate)
15#ifndef ghcjs_HOST_OS
19#ifndef ghcjs_HOST_OS
16−import Text.Regex.PCRE.Heavy (re, (=~))
20+import Text.Regex.PCRE.Heavy (re, (=~))
18validateEmailDomain :: EmailAddress -> Either String EmailAddress
22validateEmailDomain :: EmailAddress -> Either String EmailAddress
19validateEmailDomain email =
23validateEmailDomain email =
@@ -21,8 +25,8 @@ validateEmailDomain email =
21 then Right email
25 then Right email
22 else Left $ errorMessage <> (T.unpack $ T.decodeUtf8 emailDomain)
26 else Left $ errorMessage <> (T.unpack $ T.decodeUtf8 emailDomain)
24− emailDomain = Email.domainPart email
28+ emailDomain = Email.domainPart email
25− domainRegex = [re|^[^.]+(?:\.[^.]+)*\.[^.]{2,}$|]
29+ domainRegex = [re|^[^.]+(?:\.[^.]+)*\.[^.]{2,}$|]
26 errorMessage = "email domain is not valid: " :: String
30 errorMessage = "email domain is not valid: " :: String
@@ -39,3 +43,27 @@ emailToText = T.decodeUtf8 . toByteString
40emailToText = error "emailToText: unimplemented in GHCJS"
44emailToText = error "emailToText: unimplemented in GHCJS"
47+instance Arbitrary EmailAddress where
49+ s <- listOf1 (elements $ ['a'..'z'] <> ['A'..'Z'] <> ['0'..'9'])
50+ return $ unsafeEmailAddress (BSC.pack s) "example.com"
51+ -- FIXME: write the correct instance
53+ -- m <- elements [1..32]
54+ -- n <- elements [1..32]
58+ -- alphabets = T.pack $ ['a'..'Z']
59+ -- digits = T.pack $ ['0'..'9']
60+ -- alphaNum = alphabets <> digits
61+ -- symbols = "-!#$%&'*+-/=?^_`{|}~."
62+ -- localSym = alphaNum <> symbols
63+ -- encodeUtf8 <$> (replicateM m (elements localSym)
64+ -- `suchThat` (isRight . parseOnly localPart))
67+ -- domain <- replicateM n (elements ['a'..'Z'])
68+ -- domainLiteral <- elements ["com", "travel", "net", "ru", "io"]
69+ -- unsafeEmailAddress <$> local <*> domain <> "." domainLiteral