on 30cf17b help sign in
2 files changed+27−17
since splitsnapshots
unifiedsplit
email.cabal+3−4 src/Data/Email.hs+24−13
email.cabal+3−4
@@ -1,19 +1,18 @@
1−cabal-version: 2.4
21name: email
32synopsis: Reusable Email data type.
43version: 0.0.0.1
5−license-file: LICENSE
4+license: AllRightsReserved
65license-file: LICENSE
76author: Denis Redozubov
87maintainer: denis.redozubov@gmail.com
98category: Web
109build-type: Simple
10+cabal-version: >=1.10
1111library
12− build-depends: base >=4.10 && <5
12+ build-depends: base >=4.10 && <4.13
1313 , aeson
1414 , bytestring
1515 , email-validate
16− , email-validate-extra
1716 , lens >= 4.13
1817 , QuickCheck
1918 , text >= 1.2.1.3
src/Data/Email.hs+24−13
@@ -7,18 +7,19 @@ module Data.Email
77 , _EmailEmailAddress
88 ) where
99
10−import Control.Lens hiding (elements)
11−import Data.Aeson as JSON
12−import Data.ByteString
13−import Data.ByteString.Lens
14−import Data.String
15−import Data.Text as T
16−import Data.Text.Encoding (decodeUtf8)
17−import Data.Text.Lens
18−import Test.QuickCheck.Arbitrary
19−import Test.QuickCheck.Gen (elements)
20−import Text.Email.Extra (validateEmail)
21−import Text.Email.Parser
10+import Control.Lens hiding (elements)
11+import Control.Monad
12+import Data.Aeson as JSON
13+import Data.ByteString
14+import Data.ByteString.Lens
15+import Data.String
16+import Data.Text as T
17+import Data.Text.Encoding (decodeUtf8)
18+import Data.Text.Lens
19+import Test.QuickCheck.Arbitrary
20+import Test.QuickCheck.Gen (elements)
21+import Text.Email.Parser
22+import Text.Email.Validate (EmailAddress, emailAddress)
2223
2324newtype Email
2425 = Email
@@ -29,7 +30,7 @@ makePrisms ''Email
2930
3031-- | "Orphaned" prism.
3132_EmailAddress :: Prism' ByteString EmailAddress
32−_EmailAddress = prism' toByteString (preview _Right . validateEmail)
33+_EmailAddress = prism' toByteString emailAddress
3334
3435-- | Can be used like this:
3536--
@@ -50,5 +51,15 @@ instance Arbitrary Email where
5051 host <- elements ["example.com", "gmail.com" :: Text]
5152 return $ Email $ user <> host
5253
54+instance ToJSON EmailAddress where
55+ toJSON = toJSON . view (re _EmailEmailAddress . _Email)
56+
57+instance FromJSON EmailAddress where
58+ parseJSON = withText "EmailAddress" $ \s -> do
59+ let ea = s ^? re _Email . _EmailEmailAddress
60+ case ea of
61+ Just x -> pure x
62+ Nothing -> mzero
63+
5364toEmail :: EmailAddress -> Email
5465toEmail = Email . decodeUtf8 . toByteString