+{-# LANGUAGE
+ UnboxedTuples
+ , UnicodeSyntax
+ #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+-- |Manipulation of MIME Types.
module Network.HTTP.Lucu.MIMEType
( MIMEType(..)
- , (+/+) -- String -> String -> MIMEType
- , (+:+) -- MIMEType -> (String, String) -> MIMEType
- , (+=+) -- String -> String -> (String, String)
- , mimeTypeP -- Parser MIMEType
- , mimeTypeListP -- Parser [MIMEType]
+ , parseMIMEType
+ , mimeTypeP
+ , mimeTypeListP
)
where
+import qualified Data.ByteString.Lazy as B
import Network.HTTP.Lucu.Parser
import Network.HTTP.Lucu.Parser.Http
import Network.HTTP.Lucu.Utils
+import Prelude hiding (min)
-
+-- |@'MIMEType' \"major\" \"minor\" [(\"name\", \"value\")]@
+-- represents \"major\/minor; name=value\".
data MIMEType = MIMEType {
- mtMajor :: String
- , mtMinor :: String
- , mtParams :: [ (String, String) ]
+ mtMajor :: !String
+ , mtMinor :: !String
+ , mtParams :: ![ (String, String) ]
} deriving (Eq)
value
-infix 9 +/+, +=+
-infixl 8 +:+
-
-
-(+/+) :: String -> String -> MIMEType
-maj +/+ min
- = MIMEType maj min []
-
-
-(+:+) :: MIMEType -> (String, String) -> MIMEType
-mt@(MIMEType _ _ params) +:+ pair
- = mt {
- mtParams = mtParams mt ++ [pair]
- }
-
-
-(+=+) :: String -> String -> (String, String)
-name +=+ value = (name, value)
+instance Read MIMEType where
+ readsPrec _ s = [(parseMIMEType s, "")]
+-- |Parse 'MIMEType' from a 'Prelude.String'. This function throws an
+-- exception for parse error.
+parseMIMEType :: String -> MIMEType
+parseMIMEType str = case parseStr mimeTypeP str of
+ (# Success t, r #) -> if B.null r
+ then t
+ else error ("unparsable MIME Type: " ++ str)
+ (# _ , _ #) -> error ("unparsable MIME Type: " ++ str)
mimeTypeP :: Parser MIMEType
-mimeTypeP = allowEOF $
- do maj <- token
- char '/'
- min <- token
+mimeTypeP = allowEOF $!
+ do maj <- token
+ _ <- char '/'
+ min <- token
params <- many paramP
return $ MIMEType maj min params
where
paramP :: Parser (String, String)
- paramP = do many lws
- char ';'
- many lws
- name <- token
- char '='
+ paramP = do _ <- many lws
+ _ <- char ';'
+ _ <- many lws
+ name <- token
+ _ <- char '='
value <- token <|> quotedStr
return (name, value)
mimeTypeListP :: Parser [MIMEType]
-mimeTypeListP = allowEOF $ listOf mimeTypeP
+mimeTypeListP = allowEOF $! listOf mimeTypeP