{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 800
{-# LANGUAGE TemplateHaskellQuotes #-}
#else
{-# LANGUAGE TemplateHaskell #-}
#endif

module Text.Email.QuasiQuotation
    ( email
    ) where

import qualified Data.ByteString.Char8 as BS8

import Language.Haskell.TH.Quote (QuasiQuoter(..))

import Text.Email.Validate (validate, localPart, domainPart, unsafeEmailAddress)

-- | A QuasiQuoter for email addresses. 
--
-- Use it like this:
-- 
-- >>> :set -XQuasiQuotes
-- >>> [email|someone@example.com|]
-- "someone@example.com"
email :: QuasiQuoter
email = QuasiQuoter
    { quoteExp = quoteEmail emailToExp
    , quotePat = error "email is not supported as a pattern"
    , quoteDec = error "email is not supported at top-level"
    , quoteType = error "email is not supported as a type"
    }
    where

    quoteEmail p s = 
        case validate (BS8.pack s) of 
            Left err -> error ("Invalid quasi-quoted email address: " ++ err) 
            Right e -> p e

    emailToExp e = 
        let lp = BS8.unpack (localPart e) in
        let dp = BS8.unpack (domainPart e) in
        [| unsafeEmailAddress (BS8.pack lp) (BS8.pack dp) |]