{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} module Network.DigitalOcean.Services.FloatingIp where ----------------------------------------------------------------- import Data.Aeson import Data.Aeson.Casing import Data.Time.Clock import GHC.Generics ----------------------------------------------------------------- import Network.DigitalOcean.Types import Network.DigitalOcean.Utils.Pagination import Network.DigitalOcean.Utils.Actions import Network.DigitalOcean.Services.Region import Network.DigitalOcean.Services.Droplet ----------------------------------------------------------------- data FloatingIp = FloatingIp { floatingipIp :: IpAddress , floatingipRegion :: Region , floatingipDroplet :: Droplet } deriving (Show, Generic) instance FromJSON (Response FloatingIp) where parseJSON (Object v) = fmap Response $ parseJSON =<< (v .: "floating_ip") instance FromJSON (Response [FloatingIp]) where parseJSON (Object v) = fmap Response $ parseJSON =<< (v .: "floating_ips") instance FromJSON FloatingIp where parseJSON = genericParseJSON $ aesonPrefix snakeCase instance FromJSON (PaginationState FloatingIp) where parseJSON (Object v) = parsePaginationState v "floating_ips" instance Paginatable FloatingIp data FloatingIpPayload = FloatingIpRegionPayload RegionSlug | FloatingIpDropletPayload DropletId deriving Show instance ToJSON FloatingIpPayload where toJSON (FloatingIpRegionPayload regionSlug) = object [ "region" .= regionSlug ] toJSON (FloatingIpDropletPayload dropletId) = object [ "droplet_id" .= dropletId ] instance Payload FloatingIpPayload data FloatingIpAction = AssignToDroplet DropletId | Unassign deriving Show instance ToJSON FloatingIpAction where toJSON (AssignToDroplet dropletId) = object [ actionType' "assign", "droplet_id" .= dropletId ] toJSON Unassign = object [ actionType' "unassign" ] instance Payload FloatingIpAction