module Linux.Arch.Aur.Rpc
(
info
, multiinfo
, search
, msearch
, info'
, multiinfo'
, search'
, msearch'
, pretty) where
import Linux.Arch.Aur.Types
import Control.Applicative ((<$>))
import Control.Lens
import Control.Monad.Trans (MonadIO, liftIO)
import Data.Aeson (Value(..), FromJSON, Result(..), fromJSON)
import Data.Aeson.Encode.Pretty
import Data.Aeson.Lens (AsValue, key, nth)
import Data.Maybe (catMaybes)
import Data.Text
import qualified Data.Text.Lazy as TL
import Data.Text.Lazy.Encoding
import qualified Data.Vector as V
import Network.Wreq
rpcUrl :: String
rpcUrl = "https://aur.archlinux.org/rpc.php?"
apiVersion :: Text
apiVersion = "3"
info :: (MonadIO m, Functor m) => Text -> m (Maybe AurInfo)
info p = (>>= extract) <$> info' p
info' :: (MonadIO m, Functor m) => Text -> m (Maybe Value)
info' pkg = (>>= (^? nth 0)) <$> multiinfo' [pkg]
multiinfo :: (MonadIO m, Functor m) => [Text] -> m [AurInfo]
multiinfo p = mapArray <$> multiinfo' p
multiinfo' :: MonadIO m => [Text] -> m (Maybe Value)
multiinfo' pkgs = rpc "multiinfo" pkgs "arg[]"
search :: (MonadIO m, Functor m) => Text -> m [AurInfo]
search s = mapArray <$> search' s
search' :: MonadIO m => Text -> m (Maybe Value)
search' query = rpc "search" [query] "arg"
msearch :: (MonadIO m, Functor m) => Text -> m [AurInfo]
msearch m = mapArray <$> msearch' m
msearch' :: MonadIO m => Text -> m (Maybe Value)
msearch' maintainer = rpc "msearch" [maintainer] "arg"
rpc :: MonadIO m => Text -> [Text] -> Text -> m (Maybe Value)
rpc method args argLabel = liftIO (rpcResults <$> getWith opts rpcUrl)
where opts = defaults & param "type" .~ [method]
& param argLabel .~ args
& param "v" .~ [apiVersion]
rpcResults :: AsValue r => Response r -> Maybe Value
rpcResults r = r ^? responseBody . key "results"
pretty :: Value -> Text
pretty = TL.toStrict . decodeUtf8 . encodePretty
extract :: FromJSON a => Value -> Maybe a
extract = f . fromJSON
where f (Success x) = Just x
f _ = Nothing
mapArray :: FromJSON a => Maybe Value -> [a]
mapArray (Just (Array v)) = catMaybes . V.toList . V.map extract $ v
mapArray _ = []