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 |]) []]