module Linux.Arch.Aur.Rpc
(
info
, multiinfo
, search
, msearch
, infoJ
, multiinfoJ
, searchJ
, msearchJ
, info'
, multiinfo'
, search'
, msearch'
, infoJ'
, multiinfoJ'
, searchJ'
, msearchJ'
, pretty) where
import Linux.Arch.Aur.Types
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
aurUrl :: String
aurUrl = "https://aur.archlinux.org/rpc.php?"
aur4Url :: String
aur4Url = "https://aur4.archlinux.org/rpc.php?"
info :: MonadIO m => Text -> m (Maybe AurInfo)
info p = (>>= extract) <$> infoJ p
multiinfo :: MonadIO m => [Text] -> m [AurInfo]
multiinfo ps = mapArray <$> multiinfoJ ps
search :: MonadIO m => Text -> m [AurInfo]
search s = mapArray <$> searchJ s
msearch :: MonadIO m => Text -> m [AurInfo]
msearch m = mapArray <$> msearchJ m
infoJ :: MonadIO m => Text -> m (Maybe Value)
infoJ p = (>>= (^? nth 0)) <$> multiinfoJ [p]
multiinfoJ :: MonadIO m => [Text] -> m (Maybe Value)
multiinfoJ ps = multiinfoJ' ps aur4Url "4"
searchJ :: MonadIO m => Text -> m (Maybe Value)
searchJ s = searchJ' s aur4Url "4"
msearchJ :: MonadIO m => Text -> m (Maybe Value)
msearchJ m = msearchJ' m aur4Url "4"
info' :: MonadIO m => Text -> String -> Text -> m (Maybe AurInfo)
info' p url ver = (>>= extract) <$> infoJ' p url ver
multiinfo' :: MonadIO m => [Text] -> String -> Text -> m [AurInfo]
multiinfo' ps url ver = mapArray <$> multiinfoJ' ps url ver
search' :: MonadIO m => Text -> String -> Text -> m [AurInfo]
search' s url ver = mapArray <$> searchJ' s url ver
msearch' :: MonadIO m => Text -> String -> Text -> m [AurInfo]
msearch' m url ver = mapArray <$> msearchJ' m url ver
infoJ' :: MonadIO m => Text -> String -> Text -> m (Maybe Value)
infoJ' p url ver = (>>= (^? nth 0)) <$> multiinfoJ' [p] url ver
multiinfoJ' :: MonadIO m => [Text] -> String -> Text -> m (Maybe Value)
multiinfoJ' ps url ver = rpc "multiinfo" ps "arg[]" url ver
searchJ' :: MonadIO m => Text -> String -> Text -> m (Maybe Value)
searchJ' s url ver = rpc "search" [s] "arg" url ver
msearchJ' :: MonadIO m => Text -> String -> Text -> m (Maybe Value)
msearchJ' m url ver = rpc "msearch" [m] "arg" url ver
rpc :: MonadIO m => Text -> [Text] -> Text -> String -> Text -> m (Maybe Value)
rpc method args argLabel url ver = liftIO (rpcResults <$> getWith opts url)
where opts = defaults & param "type" .~ [method]
& param argLabel .~ args
& param "v" .~ [ver]
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 _ = []