email-validate-2.3.2.15: src/Text/Email/Validate.hs
module Text.Email.Validate
( isValid
, validate
, emailAddress
, canonicalizeEmail
-- Re-exports:
, EmailAddress
, domainPart
, localPart
, toByteString
, unsafeEmailAddress
)
where
import Data.Attoparsec.ByteString (endOfInput, parseOnly)
import Data.ByteString (ByteString)
import Text.Email.Parser
( EmailAddress
, addrSpec
, domainPart
, localPart
, toByteString
, unsafeEmailAddress)
-- $setup
-- This is required for all examples:
--
-- >>> :set -XOverloadedStrings
-- | Smart constructor for an email address
emailAddress :: ByteString -> Maybe EmailAddress
emailAddress = either (const Nothing) Just . validate
-- | Checks that an email is valid and returns a version of it
-- where comments and whitespace have been removed.
--
-- Example:
--
-- >>> canonicalizeEmail "spaces. are. allowed@example.com"
-- Just "spaces.are.allowed@example.com"
canonicalizeEmail :: ByteString -> Maybe ByteString
canonicalizeEmail = fmap toByteString . emailAddress
-- | Validates whether a particular string is an email address
-- according to RFC5322.
isValid :: ByteString -> Bool
isValid = either (const False) (const True) . validate
-- | If you want to find out *why* a particular string is not
-- an email address, use this.
--
-- Examples:
--
-- >>> validate "example@example.com"
-- Right "example@example.com"
--
-- >>> validate "not.good"
-- Left "at sign > @: not enough input"
validate :: ByteString -> Either String EmailAddress
validate = parseOnly (addrSpec >>= \r -> endOfInput >> return r)