{-# LANGUAGE DeriveGeneric, GeneralizedNewtypeDeriving #-}

module OpenSuse.Types.EMailAddress
  ( EMailAddress, mkEMailAddress, unEMailAddress
  )
  where

import OpenSuse.Prelude
import OpenSuse.Prelude.PrettyPrinting as Pretty
import Text.Parsec.Rfc2822 ( addr_spec )

-- |
--
-- >>> mkEMailAddress " accept . full (rfc822) . syntax @ example . org "
-- Just (EMailAddress "accept.full.syntax@example.org")
--
-- >>> mkEMailAddress "@this@is@not@good@"
-- Nothing
--
-- >>> prettyShow (fromString "joe @ example.net" :: EMailAddress)
-- "joe@example.net"
newtype EMailAddress = EMailAddress String
  deriving (Show, Eq, Ord, Generic, Hashable, Binary, NFData)

-- | Constructor function for e-mail addresses. Returns 'Nothing' if the input
-- is syntactically invalid.
mkEMailAddress :: String -> Maybe EMailAddress
mkEMailAddress = parseM "e-mail address"

-- | Accessor function for the underlying path of strings.
unEMailAddress :: EMailAddress -> String
unEMailAddress (EMailAddress str) = str

instance HasParser EMailAddress where
  parser = EMailAddress <$> addr_spec

instance IsString EMailAddress where
  fromString = parse "e-mail address"

instance Pretty EMailAddress where
  pPrint = Pretty.text . unEMailAddress