{-# LANGUAGE OverloadedStrings #-}

module Webcrank.Internal.ETag where

import Control.Applicative
import Data.Attoparsec.ByteString.Char8 (parseOnly, string)
import Data.ByteString (ByteString)

import Webcrank.Internal.Parsers
import Webcrank.Internal.Types

-- | Compares two @ETag@s for equality, only considering them equal if
-- they are both strong and byte-for-byte identical.
strongComparison :: ETag -> ETag -> Bool
strongComparison e1 e2 = case (e1, e2) of
  (StrongETag v1, StrongETag v2) -> v1 == v2
  _ -> False

-- | Compares two @ETag@s for equality, considering them equal whether or
-- not either of them is weak.
weakComparison :: ETag -> ETag -> Bool
weakComparison e1 e2 = opaqueTag e1 == opaqueTag e2

opaqueTag :: ETag -> ByteString
opaqueTag e = case e of StrongETag v -> v; WeakETag v -> v

parseETags :: ByteString -> [ETag]
parseETags = either (const[]) id . parseOnly (csl1 etagP) where
  etagP = weakP <|> strongP
  weakP = WeakETag <$> (string "W/" *> quotedStringP)
  strongP = StrongETag <$> quotedStringP