{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} module DigitalOcean.Droplet( Droplet(..), droplets ) where import Control.Applicative () import Control.Monad (liftM, mzero) import Control.Monad.IO.Class import Data.Aeson ((.:), FromJSON(..), Value(..), decode) import DigitalOcean.Base -- $setup -- >>> import System.Environment -- >>> import DigitalOcean.Base(Authentication(..)) -- >>> import Data.Maybe(isJust) data Droplet = Droplet { did :: Integer, dname :: String, dmemory :: Integer, dvcpus :: Integer, disk :: Integer, dlocked :: Bool, createdAtv2 :: String, dstatus :: String, backupIds :: [Integer] } deriving (Show, Read) newtype Droplets = Droplets [Droplet] instance FromJSON Droplets where parseJSON (Object v) = Droplets <$> v.: "droplets" parseJSON _ = mzero instance FromJSON Droplet where parseJSON (Object v) = Droplet <$> (v .: "id") <*> (v .: "name") <*> (v .: "memory") <*> (v .: "vcpus") <*> (v .: "disk") <*> (v .: "locked") <*> (v .: "created_at") <*> (v .: "status") <*> (v .: "backup_ids") parseJSON _ = mzero -- | List all Droplets -- -- @ -- do -- tkn <- getEnv "DIGITAL_OCEAN_PERSONAL_ACCESS_TOKEN" -- maybeDroplets <- droplets $ Authentication tkn -- print $ show $ isJust maybeDroplets -- @ -- droplets :: Authentication -> (MonadIO m) => m (Maybe [Droplet]) droplets a = liftM toList $ liftM decode (requestGet "droplets?page=1&per_page=100" a) toList :: Maybe Droplets -> Maybe [Droplet] toList = \ds -> case ds of Just(Droplets l) -> Just l Nothing -> Nothing