URI.hs 935 B

12345678910111213141516171819202122232425262728293031323334
  1. {-# LANGUAGE OverloadedStrings #-}
  2. module Data.SMTP.Parser.URI (parseURI) where
  3. import Data.Attoparsec.ByteString.Char8
  4. import qualified Data.Attoparsec.ByteString.Char8 as A
  5. import Data.SMTP.Types.URI
  6. import Data.SMTP.Account
  7. import Control.Applicative ((<|>))
  8. import qualified Data.Char as C
  9. import Text.StringConvert
  10. parseURI :: Parser URI
  11. parseURI = do
  12. stringCI "fCMTP://"
  13. a <- parseAccount
  14. p <- parsePath
  15. (do
  16. stringCI "#"
  17. rev <- parseRevision
  18. return $ URI a p (Just rev)
  19. ) <|> return (URI a p Nothing)
  20. parsePath :: Parser Path
  21. parsePath = (Path . s) <$> A.takeWhile isPathChar
  22. where
  23. isPathChar :: Char -> Bool
  24. isPathChar c = C.isAlphaNum c || elem c ("_-=[]{}().:%/" :: String)
  25. parseRevision :: Parser Revision
  26. parseRevision = (Revision . s) <$> A.takeWhile isRevisionChar
  27. where
  28. isRevisionChar :: Char -> Bool
  29. isRevisionChar c = C.isAlphaNum c || elem c ("+-/_=." :: String)