hdo-0.1: src/Network/DO/Net/Common.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
module Network.DO.Net.Common where
import Control.Comonad.Env.Class (ComonadEnv, ask)
import Control.Lens ((&), (.~))
import Data.Aeson as A
import qualified Data.Aeson.Types as A
import Data.ByteString.Char8 (pack)
import qualified Data.HashMap.Strict as H
import Data.Maybe
import Data.Monoid
import Data.Proxy
import Data.Text (Text)
import qualified Data.Vector as V
import Network.DO.Types as DO hiding (URI)
import Network.REST
import Network.URI (URI, parseURI)
import Network.Wreq hiding (Proxy)
import Prelude as P
rootURI :: String
rootURI = "https://api.digitalocean.com"
apiVersion :: String
apiVersion = "v2"
(</>) :: String -> String -> String
s </> ('/': s') = s ++ s'
s </> s' = s ++ "/" ++ s'
toURI :: String -> URI
toURI = fromJust . parseURI
toList :: (FromJSON a) => Text -> Value -> [a]
toList k (Object o) = let Array boxes = o H.! k
in mapMaybe (A.parseMaybe parseJSON) (V.toList boxes)
toList _ _ = []
authorisation :: String -> Options
authorisation t = defaults & header "Authorization" .~ ["Bearer " <> pack t]
class Listable a where
listEndpoint :: Proxy a -> String
listField :: Proxy a -> Text
queryList :: (ComonadEnv ToolConfiguration w, Monad m, Listable b, FromJSON b) => Proxy b -> w a -> (RESTT m [b], w a)
queryList p w = maybe (return [], w)
(\ t -> let droplets = toList (listField p) <$> getJSONWith (authorisation t) (toURI (listEndpoint p))
in (droplets, w))
(authToken (ask w))