-- |Convert an 'ETag' to 'AsciiBuilder'.
printETag ∷ ETag → AsciiBuilder
+{-# INLINEABLE printETag #-}
printETag et
= ( if etagIsWeak et then
A.toAsciiBuilder "W/"
-- |Parse 'Etag' from an 'Ascii'. This functions throws an exception
-- for parse error.
parseETag ∷ Ascii → ETag
+{-# INLINEABLE parseETag #-}
parseETag str
- = let p = do et ← eTagP
- endOfInput
- return et
- bs = A.toByteString str
- in
- case parseOnly p bs of
- Right et → et
- Left err → error ("unparsable ETag: " ⧺ A.toString str ⧺ ": " ⧺ err)
+ = case parseOnly p $ A.toByteString str of
+ Right et → et
+ Left err → error ("unparsable ETag: " ⧺ A.toString str ⧺ ": " ⧺ err)
+ where
+ p ∷ Parser ETag
+ {-# INLINE p #-}
+ p = do et ← eTagP
+ endOfInput
+ return et
-- |This is equivalent to @'ETag' 'Prelude.False'@. If you want to
-- generate an ETag from a file, try using
-- 'Network.HTTP.Lucu.StaticFile.generateETagFromFile'.
strongETag ∷ Ascii → ETag
+{-# INLINE strongETag #-}
strongETag = ETag False
-- |This is equivalent to @'ETag' 'Prelude.True'@.
weakETag ∷ Ascii → ETag
+{-# INLINE weakETag #-}
weakETag = ETag True
eTagP ∷ Parser ETag
+{-# INLINEABLE eTagP #-}
eTagP = do isWeak ← option False (string "W/" *> return True)
str ← quotedStr
return $ ETag isWeak str
eTagListP ∷ Parser [ETag]
+{-# INLINEABLE eTagListP #-}
eTagListP = do xs ← listOf eTagP
when (null xs) $
fail "empty list of ETags"