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.Monad.Trans (MonadIO, liftIO)
import Control.Lens
import Data.Aeson (Value(..), FromJSON, Result(..), fromJSON)
import Data.Aeson.Lens (AsValue, key, nth)
import Data.Aeson.Encode.Pretty
import Data.Maybe (catMaybes)
import Data.Text
import Data.Text.Lazy.Encoding
import Network.Wreq
import qualified Data.Text.Lazy as TL
import qualified Data.Vector as V
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 _ = []