---------------------------------------------------------
-- |
-- Module        : Data.Mime.Header
-- Copyright     : Michael Snoyman
-- License       : BSD3
--
-- Maintainer    : Michael Snoyman <michael@snoyman.com>
-- Stability     : Unstable
-- Portability   : portable
--
-- Functions for parsing MIME headers (Key: value; k1=v1; k2=v2)
--
---------------------------------------------------------

module Data.Mime.Header
    ( Header
    , parseHeader
    , lookupHeader
    ) where

import qualified Data.ByteString.Lazy.UTF8 as BSLU
import Data.String.Util

type SMap = [(String, String)]

-- | A single MIME header.
type Header = (String, String)

-- | Parse a header line in the format
-- Name: value; attkey=attval; attkey2=attval2.
parseHeader :: BSLU.ByteString -> Header
parseHeader bs =
    let s = BSLU.toString bs
        (k, rest) = span (/= ':') s
     in (k, tail $ tail rest)

{-
lookupHeaderAttr :: Monad m => String -> String -> [Header] -> m String
lookupHeaderAttr k1 k2 [] =
    fail $ "Could not find header when looking for attr: " ++ 
           k1 ++ ":" ++ k2
lookupHeaderAttr k1 k2 ((key, _, vals):rest)
    | k1 == key = case lookup k2 vals of
                    Nothing -> fail $ "Could not find header attr "
                                      ++ k1 ++ ":" ++ k2
                    Just v -> return v
    | otherwise = lookupHeaderAttr k1 k2 rest
-}

lookupHeader :: Monad m => String -> [Header] -> m String
lookupHeader k [] = fail $ "Header " ++ k ++ " not found"
lookupHeader k ((key, val):rest)
    | k == key = return val
    | otherwise = lookupHeader k rest