digitalocean-kzs-0.1.0.1: src/DigitalOcean/SSHKey.hs
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE OverloadedStrings #-}
module DigitalOcean.SSHKey (
SSHKey(..),
listAllKeys
) 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)
-- $setup
-- >>> import System.Environment
-- >>> import DigitalOcean.Base(Authentication(..))
-- >>> import Data.Maybe(isJust)
data SSHKey = SSHKey {
id :: Integer,
fingerprint :: String,
publicKey :: String,
sshkeyName :: String
} deriving (Show, Read)
newtype SSHKeys = SSHKeys [SSHKey]
instance FromJSON SSHKeys where
parseJSON (Object v) = SSHKeys <$> v .: "ssh_keys"
parseJSON _ = mzero
instance FromJSON SSHKey where
parseJSON (Object v) =
SSHKey <$>
(v .: "id") <*>
(v .: "fingerprint") <*>
(v .: "public_key") <*>
(v .: "name")
parseJSON _ = mzero
-- | List all Keys
--
-- @
-- do
-- tkn <- getEnv "DIGITAL_OCEAN_PERSONAL_ACCESS_TOKEN"
-- maybeKeys <- listAllKeys $ Authentication tkn
-- print $ show $ isJust maybeKeys
-- @
--
listAllKeys :: Authentication -> (MonadIO m) => m (Maybe [SSHKey])
listAllKeys a = liftM toList $ liftM decode (requestGet "account/keys" a)
toList :: Maybe SSHKeys -> Maybe [SSHKey]
toList = \sks -> case sks of Just(SSHKeys l) -> Just l
Nothing -> Nothing