module DigitalOcean.NewDroplet(
newDroplet,
NewDropletRequest(..)
) where
import Control.Applicative()
import Control.Monad (liftM, mzero)
import Control.Monad.IO.Class
import Data.Aeson ((.:), FromJSON(..), Value(..), ToJSON(..), (.=), object, decode)
import DigitalOcean.Droplet(Droplet(..))
import DigitalOcean.Base
instance ToJSON NewDropletRequest where
toJSON v = object ["name" .= ndname v,
"region" .= region v,
"size" .= size v,
"image" .= image v,
"ssh_keys" .= ndsshKeys v,
"backups" .= backups v,
"ipv6" .= ipv6 v,
"user_data" .= userData v,
"private_networking" .= privateNetworking v
]
data NewDropletRequest = NewDropletRequest {
ndname :: String,
region :: String,
size :: String,
image :: Integer,
ndsshKeys :: [String],
backups :: Bool,
ipv6 :: Bool,
userData :: Maybe(String),
privateNetworking :: Bool
} deriving (Show, Read)
newtype OuterDroplet = OuterDroplet Droplet deriving(Show)
instance FromJSON OuterDroplet where
parseJSON (Object v) = OuterDroplet <$> v .: "droplet"
parseJSON _ = mzero
newDroplet :: Authentication -> NewDropletRequest -> (MonadIO m) => m (Maybe Droplet)
newDroplet a d = liftM toDroplet $ liftM decode (requestPost "droplets" a d)
toDroplet :: Maybe OuterDroplet -> Maybe Droplet
toDroplet = \od -> case od of Just(OuterDroplet d) -> Just d
Nothing -> Nothing