{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}

-- | Copyright: (c) 2020-2021 berberman
-- SPDX-License-Identifier: MIT
-- Maintainer: berberman <berberman@yandex.com>
-- Stability: experimental
-- Portability: portable
-- This module supports <https://aur.archlinux.org/ AUR> searching.
module Distribution.ArchHs.Aur
  ( Aur,
    isInAur,
    aurToIO,
  )
where

import qualified Data.Text as T
import Distribution.ArchHs.Exception
import Distribution.ArchHs.Internal.Prelude
import Distribution.ArchHs.Name
import Distribution.ArchHs.Types
import Network.HTTP.Client (Manager)
import Web.ArchLinux

-- | AUR Effect
data Aur m a where
  IsInAur :: HasMyName n => n -> Aur m Bool

makeSem_ ''Aur

-- | Check whether a __haskell__ package exists in AUR
isInAur :: (HasMyName n, Member Aur r) => n -> Sem r Bool

-- | Run 'Aur' effect.
aurToIO :: Manager -> Members [WithMyErr, Embed IO] r => Sem (Aur ': r) a -> Sem r a
aurToIO :: forall (r :: EffectRow) a.
Manager
-> Members '[WithMyErr, Embed IO] r => Sem (Aur : r) a -> Sem r a
aurToIO Manager
manager = forall (e :: Effect) (r :: EffectRow) a.
FirstOrder e "interpret" =>
(forall (rInitial :: EffectRow) x. e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret forall a b. (a -> b) -> a -> b
$ \case
  (IsInAur n
name) -> do
    Either ClientError (AurResponse [AurSearch])
result <- forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (s :: APIType) a.
HasBaseUrl s =>
Manager -> APIClient s a -> IO (Either ClientError a)
runAPIClient Manager
manager forall b c a. (b -> c) -> (a -> b) -> a -> c
. AurSearchType -> Text -> APIClient 'Aur (AurResponse [AurSearch])
searchAur AurSearchType
ByName forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack forall a b. (a -> b) -> a -> b
$ ArchLinuxName -> String
unArchLinuxName forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n. HasMyName n => n -> ArchLinuxName
toArchLinuxName forall a b. (a -> b) -> a -> b
$ n
name
    case Either ClientError (AurResponse [AurSearch])
result of
      Left ClientError
err -> forall e (r :: EffectRow) a. Member (Error e) r => e -> Sem r a
throw forall a b. (a -> b) -> a -> b
$ ClientError -> MyException
NetworkException ClientError
err
      Right AurResponse {$sel:_results:AurResponse :: forall a. AurResponse a -> a
_results = [AurSearch
_]} -> forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
      Either ClientError (AurResponse [AurSearch])
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False