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