module Sound.Freesound.Pack.Type (
Pack(..)
) where
import Data.Aeson (FromJSON(..), Value(..), (.:))
import Data.Aeson.Types (typeMismatch)
import Data.Text (Text)
import Sound.Freesound.API (URI)
import Sound.Freesound.Time
#if __GLASGOW_HASKELL__ < 710
import Control.Applicative
#endif
newtype PackId = PackId Integer deriving (Eq, Ord, Show)
instance FromJSON PackId where
parseJSON (Number i) = return $ PackId (truncate i)
parseJSON v = typeMismatch "PackId" v
data Pack = Pack {
id :: PackId
, url :: URI
, description :: Text
, created :: UTCTime
, name :: Text
, username :: Text
, numSounds :: Int
, sounds :: URI
, numDownloads :: Int
} deriving (Eq, Show)
instance FromJSON Pack where
parseJSON (Object v) =
Pack
<$> v .: "id"
<*> v .: "url"
<*> v .: "description"
<*> (toUTCTime <$> (v .: "created"))
<*> v .: "name"
<*> v .: "username"
<*> v .: "num_sounds"
<*> v .: "sounds"
<*> v .: "num_downloads"
parseJSON v = typeMismatch "Pack" v