{-# LANGUAGE TemplateHaskell #-}
module Network.Lastfm.XML
  ( xml
  , xmlWrapper
  ) where

import Control.Applicative ((<$>))
import Control.Monad ((<=<))

import Data.ByteString.Lazy.Char8 (ByteString)
import Language.Haskell.TH
import Text.XML.Light

import Network.Lastfm.Error (LastfmError, disambiguate)
import Network.Lastfm.Internal (Format(..))


xml  Format
xml = Format
  { errorParser = xmlErrorParser
  , uriArgument = Nothing
  }


xmlWrapper  [String]  Q [Dec]
xmlWrapper = mapM func
  where
   func xs = funD (mkName xs) [clause [] (normalB $ appE (varE (mkName ("API." ++ xs))) [e| xml |]) []]


xmlErrorParser  ByteString  Maybe LastfmError
xmlErrorParser r = disambiguate . read <$> (findAttr (unqual "code") <=< findChild (unqual "error") <=< parseXMLDoc) r