module Text.Email.Text where

import Data.Attoparsec.ByteString qualified as Attoparsec.B
import Data.Text qualified as T
import Data.Text.Encoding qualified as T
import Text.Email.Parser

toText :: EmailAddress -> T.Text
toText :: EmailAddress -> Text
toText EmailAddress
emailAddress =
  case ByteString -> Either UnicodeException Text
T.decodeUtf8' (ByteString -> Either UnicodeException Text)
-> ByteString -> Either UnicodeException Text
forall a b. (a -> b) -> a -> b
$ EmailAddress -> ByteString
toByteString EmailAddress
emailAddress of
    Left UnicodeException
err -> [Char] -> Text
forall a. HasCallStack => [Char] -> a
error ([Char] -> Text) -> [Char] -> Text
forall a b. (a -> b) -> a -> b
$ [Char]
"Failed to decode EmailAddress: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> UnicodeException -> [Char]
forall a. Show a => a -> [Char]
show UnicodeException
err
    Right Text
text -> Text
text

fromText :: T.Text -> Either String EmailAddress
fromText :: Text -> Either [Char] EmailAddress
fromText Text
text = Parser EmailAddress -> ByteString -> Either [Char] EmailAddress
forall a. Parser a -> ByteString -> Either [Char] a
Attoparsec.B.parseOnly (Parser EmailAddress
addrSpec Parser EmailAddress -> Parser ByteString () -> Parser EmailAddress
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ByteString ()
forall t. Chunk t => Parser t ()
Attoparsec.B.endOfInput) (ByteString -> Either [Char] EmailAddress)
-> ByteString -> Either [Char] EmailAddress
forall a b. (a -> b) -> a -> b
$ Text -> ByteString
T.encodeUtf8 Text
text

fromTextUnsafe :: T.Text -> EmailAddress
fromTextUnsafe :: Text -> EmailAddress
fromTextUnsafe Text
text =
  case Text -> Either [Char] EmailAddress
fromText Text
text of
    Left [Char]
err -> [Char] -> EmailAddress
forall a. HasCallStack => [Char] -> a
error ([Char] -> EmailAddress) -> [Char] -> EmailAddress
forall a b. (a -> b) -> a -> b
$ [Char]
"Failed to parse EmailAddress: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
err
    Right EmailAddress
emailAddress -> EmailAddress
emailAddress