discogs-haskell-0.0.5.0: src/Discogs/Types/Error.hs
module Discogs.Types.Error
(DiscogsError(..)) where
import Control.Applicative
import Control.Monad
import Data.Aeson
import Data.Monoid
import Data.Text (Text)
import Data.Vector ((!?))
import Network.API.Builder.Receive
import Prelude
import qualified Data.Vector as V
data DiscogsError = DiscogsError Object
| NoRelease
| NoArtist
| RateLimitError Integer Text
| NoMasterRelease
| NoLabel
deriving (Show, Eq)
instance FromJSON DiscogsError where
parseJSON (Object o) = do
Array errors <- o .: "message"
case errors !? 0 of
Just (Array e) -> case V.toList e of
String "Release not found." : _ -> return NoRelease
String "Artist not found." : _ -> return NoArtist
String "RATELIMIT" : String d : _ ->
RateLimitError <$> ((o .: "json") >>= (.: "ratelimit")) <*> pure d
String "Master Release not found." : _ -> return NoMasterRelease
String "Label not found." : _ -> return NoLabel
_ -> return $ DiscogsError o
_ -> mempty
parseJSON _ = mempty
instance ErrorReceivable DiscogsError where
receiveError = useErrorFromJSON