4 , MultiParamTypeClasses
10 -- |Parsing and printing MIME Media Types
11 -- (<http://tools.ietf.org/html/rfc2046>).
12 module Network.HTTP.Lucu.MIMEType
18 import Control.Applicative
19 import Data.Ascii (Ascii, AsciiBuilder, CIAscii)
20 import qualified Data.Ascii as A
21 import Data.Attoparsec.Char8 as P
22 import Data.Convertible.Base
23 import Data.Convertible.Instances.Ascii ()
24 import Data.Convertible.Utils
25 import Data.Monoid.Unicode
27 import Language.Haskell.TH.Syntax
28 import Network.HTTP.Lucu.MIMEParams
29 import Network.HTTP.Lucu.OrphanInstances ()
30 import Network.HTTP.Lucu.Parser
31 import Network.HTTP.Lucu.Parser.Http
32 import Prelude.Unicode
34 -- |A media type, subtype, and parameters.
39 , mtParams ∷ !MIMEParams
41 deriving (Eq, Show, Read, Typeable)
43 instance Lift MIMEType where
46 mtMedia = $(lift mtMedia )
47 , mtSub = $(lift mtSub )
48 , mtParams = $(lift mtParams)
52 instance ConvertSuccess MIMEType Ascii where
53 {-# INLINE convertSuccess #-}
54 convertSuccess = convertSuccessVia ((⊥) ∷ AsciiBuilder)
56 instance ConvertSuccess MIMEType AsciiBuilder where
57 {-# INLINEABLE convertSuccess #-}
58 convertSuccess (MIMEType {..})
64 deriveAttempts [ ([t| MIMEType |], [t| Ascii |])
65 , ([t| MIMEType |], [t| AsciiBuilder |])
68 -- |Parse 'MIMEType' from an 'Ascii'. For MIME type literals, consider
69 -- using 'Network.HTTP.Lucu.MIMEType.TH.mimeType'.
70 instance ConvertAttempt Ascii MIMEType where
71 {-# INLINEABLE convertAttempt #-}
73 = case parseOnly (finishOff mimeType) (cs str) of
75 Left err → fail ("Unparsable MIME Type: " ⧺ cs str ⧺ ": " ⧺ err)
77 -- |'Parser' for an 'MIMEType'.
78 mimeType ∷ Parser MIMEType
79 {-# INLINEABLE mimeType #-}
80 mimeType = do media ← A.toCIAscii <$> token
82 sub ← A.toCIAscii <$> token
84 return $ MIMEType media sub params
86 -- |'Parser' for a list of 'MIMEType's.
87 mimeTypeList ∷ Parser [MIMEType]
88 {-# INLINE mimeTypeList #-}
89 mimeTypeList = listOf mimeType