packages feed

hackage-server-0.4: Distribution/Server/Util/Parse.hs

-- | Parsing and UTF8 utilities
module Distribution.Server.Util.Parse (
    int, unpackUTF8, packUTF8
  ) where

import qualified Distribution.Compat.ReadP as Parse

import qualified Data.Char as Char
import Data.ByteString.Lazy (ByteString)
import qualified Data.Text.Lazy           as Text
import qualified Data.Text.Lazy.Encoding  as Text
import qualified Data.Text.Encoding.Error as Text

-- | Parse a positive integer. No leading @0@'s allowed.
--
int :: Parse.ReadP r Int
int = do
  first <- Parse.satisfy Char.isDigit
  if first == '0'
    then return 0
    else do rest <- Parse.munch Char.isDigit
            return (read (first : rest))

-- | Ignore a Unicode byte order mark (BOM) at the beginning of the input        
--                                                                               
-- (Also in Distribution.Simple.Utils, but not exported)                         
ignoreBOM :: String -> String                                                    
ignoreBOM ('\xFEFF':string) = string   
ignoreBOM string            = string                                             

unpackUTF8 :: ByteString -> String
unpackUTF8 = ignoreBOM . Text.unpack . Text.decodeUtf8With Text.lenientDecode

packUTF8 :: String -> ByteString
packUTF8 = Text.encodeUtf8 . Text.pack