module Linux.Arch.Aur.Rpc
( info, search ) where
import Control.Monad.Trans (MonadIO, liftIO)
import Control.Monad.Trans.Except
import Data.Proxy
import Data.Text (Text, unpack)
import Linux.Arch.Aur.Types
import Network.HTTP.Client (Manager, newManager)
import Network.HTTP.Client.TLS
import Servant.API
import Servant.Client
import System.IO.Unsafe
type Info = "rpc" :> QueryParam "v" String
:> QueryParam "type" String
:> QueryParams "arg[]" String
:> Get '[JSON] RPCResp
type Search = "rpc" :> QueryParam "v" String
:> QueryParam "type" String
:> QueryParam "arg" String
:> Get '[JSON] RPCResp
type API = Info :<|> Search
api :: Proxy API
api = Proxy
__manager :: Manager
__manager = unsafePerformIO $ newManager tlsManagerSettings
rpcI :<|> rpcS = client api (BaseUrl Http aurUrl 80 "") __manager
where aurUrl = "aur.archlinux.org"
info :: MonadIO m => [Text] -> m [AurInfo]
info = unwrap . rpcI (Just "5") (Just "info") . map unpack
search :: MonadIO m => Text -> m [AurInfo]
search = unwrap . rpcS (Just "5") (Just "search") . Just . unpack
unwrap :: MonadIO m => ExceptT ServantError IO RPCResp -> m [AurInfo]
unwrap = liftIO . fmap (either (const []) _results) . runExceptT