module DigitalOcean.Image(
Image(..),
images,
listAllDistributionImages
) where
import Control.Applicative ((<$>), (<*>))
import Control.Monad (liftM, mzero)
import Control.Monad.IO.Class
import Data.Aeson ((.:), FromJSON(..), Value(..), decode)
import DigitalOcean.Base(Authentication, requestGet)
data Image = Image {
imgId :: Integer,
imgName :: String,
imgDistribution :: String,
imgType :: String,
imgSlug :: Maybe String,
imgPublic :: Bool,
imgRegions :: [String],
imgMinDiskSize :: Integer,
imgCreatedAt :: String
} deriving(Show, Read)
images :: Authentication -> (MonadIO m) => m (Maybe [Image])
images a = liftM toList $ liftM decode (requestGet "images?page=1&per_page=1" a)
listAllDistributionImages :: Authentication -> (MonadIO m) => m (Maybe [Image])
listAllDistributionImages a = liftM toList $ liftM decode (requestGet "images?page=1&per_page=100&type=distribution" a)
toList :: Maybe Images -> Maybe [Image]
toList = \ds -> case ds of Just(Images l) -> Just l
Nothing -> Nothing
newtype Images = Images [Image]
instance FromJSON Images where
parseJSON (Object v) = Images <$> v.: "images"
parseJSON _ = mzero
instance FromJSON Image where
parseJSON (Object v) =
Image <$>
(v .: "id") <*>
(v .: "name") <*>
(v .: "distribution") <*>
(v .: "type") <*>
(v .: "slug") <*>
(v .: "public") <*>
(v .: "regions") <*>
(v .: "min_disk_size") <*>
(v .: "created_at")
parseJSON _ = mzero