module Network.HTTP.Lucu.ETag ( ETag , mkETag -- Bool -> String -> ETag , eTagP -- Parser ETag , eTagListP -- Parser [ETag] ) where import Network.HTTP.Lucu.Parser import Network.HTTP.Lucu.Parser.Http data ETag = ETag { etagIsWeak :: Bool , etagToken :: String } deriving (Eq) instance Show ETag where show (ETag isWeak token) = (if isWeak then "W/" else "") ++ foldr (++) "" (["\""] ++ map quote token ++ ["\""]) where quote :: Char -> String quote '"' = "\\\"" quote c = [c] mkETag :: Bool -> String -> ETag mkETag = ETag eTagP :: Parser ETag eTagP = do isWeak <- option False (string "W/" >> return True) str <- quotedStr return $ mkETag isWeak str eTagListP :: Parser [ETag] eTagListP = allowEOF $ sepBy1 eTagP (do many sp char ',' many sp)