module DigitalOcean.Size(
Size(..),
sizes
) 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 Size = Size {
sizSlug :: String,
sizAvailable :: Bool,
sizTransfer :: Integer,
sizPriceMonthly :: Float,
sizHourly :: Float,
sizMemory :: Integer,
sizVcpus :: Integer,
sizDisk :: Integer
} deriving(Show, Read)
newtype Sizes = Sizes [Size]
instance FromJSON Sizes where
parseJSON (Object v) = Sizes <$> v.: "sizes"
parseJSON _ = mzero
sizes :: Authentication -> (MonadIO m) => m (Maybe [Size])
sizes a = liftM toList $ liftM decode (requestGet "sizes" a)
instance FromJSON Size where
parseJSON (Object v) =
Size <$>
(v .: "slug") <*>
(v .: "available") <*>
(v .: "transfer") <*>
(v .: "price_monthly") <*>
(v .: "price_hourly") <*>
(v .: "memory") <*>
(v .: "vcpus") <*>
(v .: "disk")
parseJSON _ = mzero
toList :: Maybe Sizes -> Maybe [Size]
toList = \ss -> case ss of Just(Sizes l) -> Just l
Nothing -> Nothing