{-# LANGUAGE OverloadedStrings #-} module Data.SMTP.Parser.URI (parseURI) where import Data.Attoparsec.ByteString.Char8 import qualified Data.Attoparsec.ByteString.Char8 as A import Data.SMTP.Types.URI import Data.SMTP.Account import Control.Applicative ((<|>)) import qualified Data.Char as C import Text.StringConvert parseURI :: Parser URI parseURI = do stringCI "fCMTP://" a <- parseAccount p <- parsePath (do stringCI "#" rev <- parseRevision return $ URI a p (Just rev) ) <|> return (URI a p Nothing) parsePath :: Parser Path parsePath = (Path . s) <$> A.takeWhile isPathChar where isPathChar :: Char -> Bool isPathChar c = C.isAlphaNum c || elem c ("_-=[]{}().:%/" :: String) parseRevision :: Parser Revision parseRevision = (Revision . s) <$> A.takeWhile isRevisionChar where isRevisionChar :: Char -> Bool isRevisionChar c = C.isAlphaNum c || elem c ("+-/_=." :: String)