{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Network.Lastfm.JSON
  ( json
  , jsonWrapper
  ) where

import Control.Applicative ((<$>), empty)

import qualified Data.Aeson as A
import qualified Data.Aeson.Types as A
import qualified Data.Attoparsec.Lazy as AP
import Data.ByteString.Lazy (ByteString)
import Language.Haskell.TH

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


json  Format
json = Format
  { errorParser = parser
  , uriArgument = Just ("format","json")
  }


parser  ByteString  Maybe LastfmError
parser xs = case AP.parse A.json xs of
  AP.Done _ j  case A.parse p j of
    A.Success v  Just v
    _  Nothing
  _  Nothing
 where
  p (A.Object v) = disambiguate <$> v A..: "error"
  p _ = empty


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