{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE StandaloneDeriving #-}

-- | Copyright: (c) 2021 berberman
-- SPDX-License-Identifier: MIT
-- Maintainer: berberman <berberman@yandex.com>
-- Stability: experimental
-- Portability: portable
-- This module defines types and their serializations used in API.
--
-- Fields' names are prefixed with @_@ for lenses generation,
-- consider using "Web.ArchLinux.Types.Lens" to access data types smoothly.
module Web.ArchLinux.Types
  ( -- * Arch Linux official
    Repo (..),
    Arch (..),
    License (..),
    PackageInformation (..),
    PackageFiles (..),
    Flagged (..),
    ArchLinuxResponse (..),

    -- * AUR
    AurSearch (..),
    AurInfo (..),
    AurResponseType (..),
    AurResponse (..),
  )
where

import Data.Aeson
import Data.Char (toUpper)
import Data.Maybe (fromJust, fromMaybe)
import Data.Text (Text)
import qualified Data.Text as T
import Data.Time (UTCTime)
import Deriving.Aeson
import Servant.API (ToHttpApiData (..))

type ArchLinuxJSON = CustomJSON '[FieldLabelModifier (StripPrefix "_", CamelToSnake)]

unString :: Value -> Text
unString :: Value -> Text
unString (String Text
x) = Text
x
unString Value
_ = forall a. HasCallStack => a
undefined

toQueryParamViaJSON :: ToJSON a => a -> Text
toQueryParamViaJSON :: forall a. ToJSON a => a -> Text
toQueryParamViaJSON = Value -> Text
unString forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. FromJSON a => ByteString -> Maybe a
decode forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToJSON a => a -> ByteString
encode

data AurModifier

instance StringModifier AurModifier where
  getStringModifier :: String -> String
getStringModifier (String -> Text
T.pack -> Text
t) = Text -> String
T.unpack forall a b. (a -> b) -> a -> b
$ Text -> Text -> Text -> Text
eat Text
"Url" Text
"URL" forall a b. (a -> b) -> a -> b
$ Text -> Text -> Text -> Text
eat Text
"Id" Text
"ID" Text
upper
    where
      upper :: Text
upper =
        case Text -> Maybe (Char, Text)
T.uncons Text
t of
          Just (Char
h, Text
s) -> Char -> Text -> Text
T.cons (Char -> Char
toUpper Char
h) Text
s
          Maybe (Char, Text)
_ -> forall a. HasCallStack => String -> a
error String
"impossible"
      eat :: Text -> Text -> Text -> Text
eat Text
prefix Text
to Text
input = case Text -> Text -> Maybe Text
T.stripPrefix Text
prefix Text
input of
        Just Text
x -> Text
to forall a. Semigroup a => a -> a -> a
<> Text
x
        Maybe Text
_ -> Text
input

type AurJSON = CustomJSON '[FieldLabelModifier (StripPrefix "_", AurModifier)]

-----------------------------------------------------------------------------

-- | Official repositories.
data Repo
  = Core
  | CoreTesting
  | Extra
  | ExtraTesting
  | Multilib
  | MultilibTesting
  | GnomeUnstable
  | KDEUnstable
  deriving stock (Int -> Repo -> String -> String
[Repo] -> String -> String
Repo -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [Repo] -> String -> String
$cshowList :: [Repo] -> String -> String
show :: Repo -> String
$cshow :: Repo -> String
showsPrec :: Int -> Repo -> String -> String
$cshowsPrec :: Int -> Repo -> String -> String
Show, Repo -> Repo -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Repo -> Repo -> Bool
$c/= :: Repo -> Repo -> Bool
== :: Repo -> Repo -> Bool
$c== :: Repo -> Repo -> Bool
Eq, Eq Repo
Repo -> Repo -> Bool
Repo -> Repo -> Ordering
Repo -> Repo -> Repo
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Repo -> Repo -> Repo
$cmin :: Repo -> Repo -> Repo
max :: Repo -> Repo -> Repo
$cmax :: Repo -> Repo -> Repo
>= :: Repo -> Repo -> Bool
$c>= :: Repo -> Repo -> Bool
> :: Repo -> Repo -> Bool
$c> :: Repo -> Repo -> Bool
<= :: Repo -> Repo -> Bool
$c<= :: Repo -> Repo -> Bool
< :: Repo -> Repo -> Bool
$c< :: Repo -> Repo -> Bool
compare :: Repo -> Repo -> Ordering
$ccompare :: Repo -> Repo -> Ordering
Ord, Int -> Repo
Repo -> Int
Repo -> [Repo]
Repo -> Repo
Repo -> Repo -> [Repo]
Repo -> Repo -> Repo -> [Repo]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Repo -> Repo -> Repo -> [Repo]
$cenumFromThenTo :: Repo -> Repo -> Repo -> [Repo]
enumFromTo :: Repo -> Repo -> [Repo]
$cenumFromTo :: Repo -> Repo -> [Repo]
enumFromThen :: Repo -> Repo -> [Repo]
$cenumFromThen :: Repo -> Repo -> [Repo]
enumFrom :: Repo -> [Repo]
$cenumFrom :: Repo -> [Repo]
fromEnum :: Repo -> Int
$cfromEnum :: Repo -> Int
toEnum :: Int -> Repo
$ctoEnum :: Int -> Repo
pred :: Repo -> Repo
$cpred :: Repo -> Repo
succ :: Repo -> Repo
$csucc :: Repo -> Repo
Enum, forall x. Rep Repo x -> Repo
forall x. Repo -> Rep Repo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Repo x -> Repo
$cfrom :: forall x. Repo -> Rep Repo x
Generic)
  deriving (Value -> Parser [Repo]
Value -> Parser Repo
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Repo]
$cparseJSONList :: Value -> Parser [Repo]
parseJSON :: Value -> Parser Repo
$cparseJSON :: Value -> Parser Repo
FromJSON, [Repo] -> Encoding
[Repo] -> Value
Repo -> Encoding
Repo -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Repo] -> Encoding
$ctoEncodingList :: [Repo] -> Encoding
toJSONList :: [Repo] -> Value
$ctoJSONList :: [Repo] -> Value
toEncoding :: Repo -> Encoding
$ctoEncoding :: Repo -> Encoding
toJSON :: Repo -> Value
$ctoJSON :: Repo -> Value
ToJSON) via CustomJSON '[ConstructorTagModifier CamelToKebab] Repo

instance ToHttpApiData Repo where
  toQueryParam :: Repo -> Text
toQueryParam (forall a. ToJSON a => a -> Text
toQueryParamViaJSON -> Text
x) = case Text -> Text -> (Text, Text)
T.breakOn Text
"-" Text
x of
    (Text -> Maybe (Char, Text)
T.uncons -> Just (Char
h, Text
s), Text
"") -> Char -> Text -> Text
T.cons (Char -> Char
toUpper Char
h) Text
s
    (Text -> Maybe (Char, Text)
T.uncons -> Just (Char
h1, Text
s1), Text -> Maybe (Char, Text)
T.uncons -> Just (Char
'-', Text -> Maybe (Char, Text)
T.uncons -> Just (Char
h2, Text
s2))) ->
      Char -> Text -> Text
T.cons (Char -> Char
toUpper Char
h1) Text
s1 forall a. Semigroup a => a -> a -> a
<> Text
"-" forall a. Semigroup a => a -> a -> a
<> Char -> Text -> Text
T.cons (Char -> Char
toUpper Char
h2) Text
s2
    (Text, Text)
_ -> forall a. HasCallStack => a
undefined

-- | Official architectures.
data Arch
  = Any
  | I686
  | X86_64
  deriving stock (Int -> Arch -> String -> String
[Arch] -> String -> String
Arch -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [Arch] -> String -> String
$cshowList :: [Arch] -> String -> String
show :: Arch -> String
$cshow :: Arch -> String
showsPrec :: Int -> Arch -> String -> String
$cshowsPrec :: Int -> Arch -> String -> String
Show, Arch -> Arch -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Arch -> Arch -> Bool
$c/= :: Arch -> Arch -> Bool
== :: Arch -> Arch -> Bool
$c== :: Arch -> Arch -> Bool
Eq, Eq Arch
Arch -> Arch -> Bool
Arch -> Arch -> Ordering
Arch -> Arch -> Arch
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Arch -> Arch -> Arch
$cmin :: Arch -> Arch -> Arch
max :: Arch -> Arch -> Arch
$cmax :: Arch -> Arch -> Arch
>= :: Arch -> Arch -> Bool
$c>= :: Arch -> Arch -> Bool
> :: Arch -> Arch -> Bool
$c> :: Arch -> Arch -> Bool
<= :: Arch -> Arch -> Bool
$c<= :: Arch -> Arch -> Bool
< :: Arch -> Arch -> Bool
$c< :: Arch -> Arch -> Bool
compare :: Arch -> Arch -> Ordering
$ccompare :: Arch -> Arch -> Ordering
Ord, Int -> Arch
Arch -> Int
Arch -> [Arch]
Arch -> Arch
Arch -> Arch -> [Arch]
Arch -> Arch -> Arch -> [Arch]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Arch -> Arch -> Arch -> [Arch]
$cenumFromThenTo :: Arch -> Arch -> Arch -> [Arch]
enumFromTo :: Arch -> Arch -> [Arch]
$cenumFromTo :: Arch -> Arch -> [Arch]
enumFromThen :: Arch -> Arch -> [Arch]
$cenumFromThen :: Arch -> Arch -> [Arch]
enumFrom :: Arch -> [Arch]
$cenumFrom :: Arch -> [Arch]
fromEnum :: Arch -> Int
$cfromEnum :: Arch -> Int
toEnum :: Int -> Arch
$ctoEnum :: Int -> Arch
pred :: Arch -> Arch
$cpred :: Arch -> Arch
succ :: Arch -> Arch
$csucc :: Arch -> Arch
Enum, forall x. Rep Arch x -> Arch
forall x. Arch -> Rep Arch x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Arch x -> Arch
$cfrom :: forall x. Arch -> Rep Arch x
Generic)
  deriving (Value -> Parser [Arch]
Value -> Parser Arch
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Arch]
$cparseJSONList :: Value -> Parser [Arch]
parseJSON :: Value -> Parser Arch
$cparseJSON :: Value -> Parser Arch
FromJSON, [Arch] -> Encoding
[Arch] -> Value
Arch -> Encoding
Arch -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Arch] -> Encoding
$ctoEncodingList :: [Arch] -> Encoding
toJSONList :: [Arch] -> Value
$ctoJSONList :: [Arch] -> Value
toEncoding :: Arch -> Encoding
$ctoEncoding :: Arch -> Encoding
toJSON :: Arch -> Value
$ctoJSON :: Arch -> Value
ToJSON) via CustomJSON '[ConstructorTagModifier CamelToSnake] Arch

instance ToHttpApiData Arch where
  toQueryParam :: Arch -> Text
toQueryParam = forall a. ToJSON a => a -> Text
toQueryParamViaJSON

-- | Liceses defined in <https://archlinux.org/packages/core/any/licenses/>,
-- plus special cases listed on the wiki <https://wiki.archlinux.org/title/PKGBUILD#license>.
data License
  = AGPL3
  | Apache
  | Artistic2_0
  | CDDL
  | CPL
  | EPL
  | FDL1_2
  | FDL1_3
  | GPL2
  | GPL3
  | LGPL2_1
  | LGPL3
  | LPPL
  | MPL
  | MPL2
  | PHP
  | PSF
  | PerlArtistic
  | RUBY
  | Unlicense
  | W3C
  | ZPL
  | BSD
  | ISC
  | MIT
  | ZLIB
  | Python
  | OFL
  | Custom Text
  deriving stock (Int -> License -> String -> String
[License] -> String -> String
License -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [License] -> String -> String
$cshowList :: [License] -> String -> String
show :: License -> String
$cshow :: License -> String
showsPrec :: Int -> License -> String -> String
$cshowsPrec :: Int -> License -> String -> String
Show, License -> License -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: License -> License -> Bool
$c/= :: License -> License -> Bool
== :: License -> License -> Bool
$c== :: License -> License -> Bool
Eq, Eq License
License -> License -> Bool
License -> License -> Ordering
License -> License -> License
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: License -> License -> License
$cmin :: License -> License -> License
max :: License -> License -> License
$cmax :: License -> License -> License
>= :: License -> License -> Bool
$c>= :: License -> License -> Bool
> :: License -> License -> Bool
$c> :: License -> License -> Bool
<= :: License -> License -> Bool
$c<= :: License -> License -> Bool
< :: License -> License -> Bool
$c< :: License -> License -> Bool
compare :: License -> License -> Ordering
$ccompare :: License -> License -> Ordering
Ord, forall x. Rep License x -> License
forall x. License -> Rep License x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep License x -> License
$cfrom :: forall x. License -> Rep License x
Generic)

licenseJSONOption :: Options
licenseJSONOption :: Options
licenseJSONOption =
  Options
defaultOptions
    { fieldLabelModifier :: String -> String
fieldLabelModifier = Text -> String
T.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> Text -> Text
T.replace Text
"_" Text
"." forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack,
      sumEncoding :: SumEncoding
sumEncoding = SumEncoding
UntaggedValue
    }

instance ToJSON License where
  toJSON :: License -> Value
toJSON (Custom Text
x) = Text -> Value
String forall a b. (a -> b) -> a -> b
$ Text
"custom: " forall a. Semigroup a => a -> a -> a
<> Text
x
  toJSON License
x =
    forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
licenseJSONOption License
x

instance FromJSON License where
  parseJSON :: Value -> Parser License
parseJSON = forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"License" forall a b. (a -> b) -> a -> b
$ \Text
txt -> do
    case Text -> Text -> Maybe Text
T.stripPrefix Text
"custom:" Text
txt of
      Just Text
c -> forall (f :: Type -> Type) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Text -> License
Custom Text
c
      Maybe Text
_ -> forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
licenseJSONOption (Text -> Value
String forall a b. (a -> b) -> a -> b
$ Text -> Text
T.stripStart Text
txt)

-- | Package details returned by 'Web.ArchLinux.API.getPackageDetails'.
data PackageInformation = PackageInformation
  { PackageInformation -> Text
_pkgname :: Text,
    PackageInformation -> Text
_pkgbase :: Text,
    PackageInformation -> Repo
_repo :: Repo,
    PackageInformation -> Arch
_arch :: Arch,
    PackageInformation -> Text
_pkgver :: Text,
    PackageInformation -> Text
_pkgrel :: Text,
    PackageInformation -> Int
_epoch :: Int,
    PackageInformation -> Text
_pkgdesc :: Text,
    PackageInformation -> Text
_url :: Text,
    PackageInformation -> Text
_filename :: Text,
    PackageInformation -> Int
_compressedSize :: Int,
    PackageInformation -> Int
_installedSize :: Int,
    PackageInformation -> UTCTime
_buildDate :: UTCTime,
    PackageInformation -> UTCTime
_lastUpdate :: UTCTime,
    PackageInformation -> Maybe UTCTime
_flageDate :: Maybe UTCTime,
    PackageInformation -> [Text]
_maintainers :: [Text],
    PackageInformation -> Text
_packager :: Text,
    PackageInformation -> [Text]
_groups :: [Text],
    PackageInformation -> [License]
_licenses :: [License],
    PackageInformation -> [Text]
_conflicts :: [Text],
    PackageInformation -> [Text]
_provides :: [Text],
    PackageInformation -> [Text]
_replaces :: [Text],
    PackageInformation -> [Text]
_depends :: [Text],
    PackageInformation -> [Text]
_optdepends :: [Text],
    PackageInformation -> [Text]
_makedepends :: [Text],
    PackageInformation -> [Text]
_checkdepends :: [Text]
  }
  deriving stock (Int -> PackageInformation -> String -> String
[PackageInformation] -> String -> String
PackageInformation -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [PackageInformation] -> String -> String
$cshowList :: [PackageInformation] -> String -> String
show :: PackageInformation -> String
$cshow :: PackageInformation -> String
showsPrec :: Int -> PackageInformation -> String -> String
$cshowsPrec :: Int -> PackageInformation -> String -> String
Show, PackageInformation -> PackageInformation -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PackageInformation -> PackageInformation -> Bool
$c/= :: PackageInformation -> PackageInformation -> Bool
== :: PackageInformation -> PackageInformation -> Bool
$c== :: PackageInformation -> PackageInformation -> Bool
Eq, Eq PackageInformation
PackageInformation -> PackageInformation -> Bool
PackageInformation -> PackageInformation -> Ordering
PackageInformation -> PackageInformation -> PackageInformation
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PackageInformation -> PackageInformation -> PackageInformation
$cmin :: PackageInformation -> PackageInformation -> PackageInformation
max :: PackageInformation -> PackageInformation -> PackageInformation
$cmax :: PackageInformation -> PackageInformation -> PackageInformation
>= :: PackageInformation -> PackageInformation -> Bool
$c>= :: PackageInformation -> PackageInformation -> Bool
> :: PackageInformation -> PackageInformation -> Bool
$c> :: PackageInformation -> PackageInformation -> Bool
<= :: PackageInformation -> PackageInformation -> Bool
$c<= :: PackageInformation -> PackageInformation -> Bool
< :: PackageInformation -> PackageInformation -> Bool
$c< :: PackageInformation -> PackageInformation -> Bool
compare :: PackageInformation -> PackageInformation -> Ordering
$ccompare :: PackageInformation -> PackageInformation -> Ordering
Ord, forall x. Rep PackageInformation x -> PackageInformation
forall x. PackageInformation -> Rep PackageInformation x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep PackageInformation x -> PackageInformation
$cfrom :: forall x. PackageInformation -> Rep PackageInformation x
Generic)
  deriving (Value -> Parser [PackageInformation]
Value -> Parser PackageInformation
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [PackageInformation]
$cparseJSONList :: Value -> Parser [PackageInformation]
parseJSON :: Value -> Parser PackageInformation
$cparseJSON :: Value -> Parser PackageInformation
FromJSON, [PackageInformation] -> Encoding
[PackageInformation] -> Value
PackageInformation -> Encoding
PackageInformation -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [PackageInformation] -> Encoding
$ctoEncodingList :: [PackageInformation] -> Encoding
toJSONList :: [PackageInformation] -> Value
$ctoJSONList :: [PackageInformation] -> Value
toEncoding :: PackageInformation -> Encoding
$ctoEncoding :: PackageInformation -> Encoding
toJSON :: PackageInformation -> Value
$ctoJSON :: PackageInformation -> Value
ToJSON) via ArchLinuxJSON PackageInformation

-- | Package files list returned by 'Web.ArchLinux.API.getPackageFiles'
data PackageFiles = PackageFiles
  { PackageFiles -> Text
_pkgname :: Text,
    PackageFiles -> Repo
_repo :: Repo,
    PackageFiles -> Arch
_arch :: Arch,
    PackageFiles -> UTCTime
_pkgLastUpdate :: UTCTime,
    PackageFiles -> UTCTime
_filesLastUpdate :: UTCTime,
    PackageFiles -> Int
_filesCount :: Int,
    PackageFiles -> Int
_dirCount :: Int,
    PackageFiles -> [String]
_files :: [FilePath]
  }
  deriving stock (Int -> PackageFiles -> String -> String
[PackageFiles] -> String -> String
PackageFiles -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [PackageFiles] -> String -> String
$cshowList :: [PackageFiles] -> String -> String
show :: PackageFiles -> String
$cshow :: PackageFiles -> String
showsPrec :: Int -> PackageFiles -> String -> String
$cshowsPrec :: Int -> PackageFiles -> String -> String
Show, PackageFiles -> PackageFiles -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PackageFiles -> PackageFiles -> Bool
$c/= :: PackageFiles -> PackageFiles -> Bool
== :: PackageFiles -> PackageFiles -> Bool
$c== :: PackageFiles -> PackageFiles -> Bool
Eq, Eq PackageFiles
PackageFiles -> PackageFiles -> Bool
PackageFiles -> PackageFiles -> Ordering
PackageFiles -> PackageFiles -> PackageFiles
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PackageFiles -> PackageFiles -> PackageFiles
$cmin :: PackageFiles -> PackageFiles -> PackageFiles
max :: PackageFiles -> PackageFiles -> PackageFiles
$cmax :: PackageFiles -> PackageFiles -> PackageFiles
>= :: PackageFiles -> PackageFiles -> Bool
$c>= :: PackageFiles -> PackageFiles -> Bool
> :: PackageFiles -> PackageFiles -> Bool
$c> :: PackageFiles -> PackageFiles -> Bool
<= :: PackageFiles -> PackageFiles -> Bool
$c<= :: PackageFiles -> PackageFiles -> Bool
< :: PackageFiles -> PackageFiles -> Bool
$c< :: PackageFiles -> PackageFiles -> Bool
compare :: PackageFiles -> PackageFiles -> Ordering
$ccompare :: PackageFiles -> PackageFiles -> Ordering
Ord, forall x. Rep PackageFiles x -> PackageFiles
forall x. PackageFiles -> Rep PackageFiles x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep PackageFiles x -> PackageFiles
$cfrom :: forall x. PackageFiles -> Rep PackageFiles x
Generic)
  deriving (Value -> Parser [PackageFiles]
Value -> Parser PackageFiles
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [PackageFiles]
$cparseJSONList :: Value -> Parser [PackageFiles]
parseJSON :: Value -> Parser PackageFiles
$cparseJSON :: Value -> Parser PackageFiles
FromJSON, [PackageFiles] -> Encoding
[PackageFiles] -> Value
PackageFiles -> Encoding
PackageFiles -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [PackageFiles] -> Encoding
$ctoEncodingList :: [PackageFiles] -> Encoding
toJSONList :: [PackageFiles] -> Value
$ctoJSONList :: [PackageFiles] -> Value
toEncoding :: PackageFiles -> Encoding
$ctoEncoding :: PackageFiles -> Encoding
toJSON :: PackageFiles -> Value
$ctoJSON :: PackageFiles -> Value
ToJSON) via ArchLinuxJSON PackageFiles

-- | Flagged package means out-of-date.
data Flagged = Flagged | NotFlagged
  deriving stock (Int -> Flagged -> String -> String
[Flagged] -> String -> String
Flagged -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [Flagged] -> String -> String
$cshowList :: [Flagged] -> String -> String
show :: Flagged -> String
$cshow :: Flagged -> String
showsPrec :: Int -> Flagged -> String -> String
$cshowsPrec :: Int -> Flagged -> String -> String
Show, Flagged -> Flagged -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Flagged -> Flagged -> Bool
$c/= :: Flagged -> Flagged -> Bool
== :: Flagged -> Flagged -> Bool
$c== :: Flagged -> Flagged -> Bool
Eq, Eq Flagged
Flagged -> Flagged -> Bool
Flagged -> Flagged -> Ordering
Flagged -> Flagged -> Flagged
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Flagged -> Flagged -> Flagged
$cmin :: Flagged -> Flagged -> Flagged
max :: Flagged -> Flagged -> Flagged
$cmax :: Flagged -> Flagged -> Flagged
>= :: Flagged -> Flagged -> Bool
$c>= :: Flagged -> Flagged -> Bool
> :: Flagged -> Flagged -> Bool
$c> :: Flagged -> Flagged -> Bool
<= :: Flagged -> Flagged -> Bool
$c<= :: Flagged -> Flagged -> Bool
< :: Flagged -> Flagged -> Bool
$c< :: Flagged -> Flagged -> Bool
compare :: Flagged -> Flagged -> Ordering
$ccompare :: Flagged -> Flagged -> Ordering
Ord, Int -> Flagged
Flagged -> Int
Flagged -> [Flagged]
Flagged -> Flagged
Flagged -> Flagged -> [Flagged]
Flagged -> Flagged -> Flagged -> [Flagged]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Flagged -> Flagged -> Flagged -> [Flagged]
$cenumFromThenTo :: Flagged -> Flagged -> Flagged -> [Flagged]
enumFromTo :: Flagged -> Flagged -> [Flagged]
$cenumFromTo :: Flagged -> Flagged -> [Flagged]
enumFromThen :: Flagged -> Flagged -> [Flagged]
$cenumFromThen :: Flagged -> Flagged -> [Flagged]
enumFrom :: Flagged -> [Flagged]
$cenumFrom :: Flagged -> [Flagged]
fromEnum :: Flagged -> Int
$cfromEnum :: Flagged -> Int
toEnum :: Int -> Flagged
$ctoEnum :: Int -> Flagged
pred :: Flagged -> Flagged
$cpred :: Flagged -> Flagged
succ :: Flagged -> Flagged
$csucc :: Flagged -> Flagged
Enum, forall x. Rep Flagged x -> Flagged
forall x. Flagged -> Rep Flagged x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Flagged x -> Flagged
$cfrom :: forall x. Flagged -> Rep Flagged x
Generic)

instance ToHttpApiData Flagged where
  toQueryParam :: Flagged -> Text
toQueryParam Flagged
Flagged = Text
"Flagged"
  toQueryParam Flagged
NotFlagged = Text
"Not+Flagged"

-- | Response data type of 'Web.ArchLinux.API.searchPackage'.
data ArchLinuxResponse a = ArchLinuxResponse
  { forall a. ArchLinuxResponse a -> Int
_version :: Int,
    forall a. ArchLinuxResponse a -> Int
_limit :: Int,
    forall a. ArchLinuxResponse a -> Bool
_valid :: Bool,
    forall a. ArchLinuxResponse a -> [a]
_results :: [a]
  }
  deriving stock (Int -> ArchLinuxResponse a -> String -> String
forall a. Show a => Int -> ArchLinuxResponse a -> String -> String
forall a. Show a => [ArchLinuxResponse a] -> String -> String
forall a. Show a => ArchLinuxResponse a -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [ArchLinuxResponse a] -> String -> String
$cshowList :: forall a. Show a => [ArchLinuxResponse a] -> String -> String
show :: ArchLinuxResponse a -> String
$cshow :: forall a. Show a => ArchLinuxResponse a -> String
showsPrec :: Int -> ArchLinuxResponse a -> String -> String
$cshowsPrec :: forall a. Show a => Int -> ArchLinuxResponse a -> String -> String
Show, ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
forall a.
Eq a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
$c/= :: forall a.
Eq a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
== :: ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
$c== :: forall a.
Eq a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
Eq, ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
ArchLinuxResponse a -> ArchLinuxResponse a -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a}. Ord a => Eq (ArchLinuxResponse a)
forall a.
Ord a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
forall a.
Ord a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> Ordering
forall a.
Ord a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> ArchLinuxResponse a
min :: ArchLinuxResponse a -> ArchLinuxResponse a -> ArchLinuxResponse a
$cmin :: forall a.
Ord a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> ArchLinuxResponse a
max :: ArchLinuxResponse a -> ArchLinuxResponse a -> ArchLinuxResponse a
$cmax :: forall a.
Ord a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> ArchLinuxResponse a
>= :: ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
$c>= :: forall a.
Ord a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
> :: ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
$c> :: forall a.
Ord a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
<= :: ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
$c<= :: forall a.
Ord a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
< :: ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
$c< :: forall a.
Ord a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> Bool
compare :: ArchLinuxResponse a -> ArchLinuxResponse a -> Ordering
$ccompare :: forall a.
Ord a =>
ArchLinuxResponse a -> ArchLinuxResponse a -> Ordering
Ord, forall a b. a -> ArchLinuxResponse b -> ArchLinuxResponse a
forall a b. (a -> b) -> ArchLinuxResponse a -> ArchLinuxResponse b
forall (f :: Type -> Type).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> ArchLinuxResponse b -> ArchLinuxResponse a
$c<$ :: forall a b. a -> ArchLinuxResponse b -> ArchLinuxResponse a
fmap :: forall a b. (a -> b) -> ArchLinuxResponse a -> ArchLinuxResponse b
$cfmap :: forall a b. (a -> b) -> ArchLinuxResponse a -> ArchLinuxResponse b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (ArchLinuxResponse a) x -> ArchLinuxResponse a
forall a x. ArchLinuxResponse a -> Rep (ArchLinuxResponse a) x
$cto :: forall a x. Rep (ArchLinuxResponse a) x -> ArchLinuxResponse a
$cfrom :: forall a x. ArchLinuxResponse a -> Rep (ArchLinuxResponse a) x
Generic)

deriving via ArchLinuxJSON (ArchLinuxResponse a) instance (FromJSON a) => FromJSON (ArchLinuxResponse a)

deriving via ArchLinuxJSON (ArchLinuxResponse a) instance (ToJSON a) => ToJSON (ArchLinuxResponse a)

-----------------------------------------------------------------------------

-- | Search results returned by 'Web.ArchLinux.API.searchAur'.
--
-- Some of fields are renamed in this record type, for sharing
-- overloaded lenses between data type returned by Arch Linux official API.
data AurSearch = AurSearch
  { AurSearch -> Int
_id :: Int,
    AurSearch -> Text
_name :: Text,
    AurSearch -> Int
_packageBaseID :: Int,
    AurSearch -> Text
_packageBase :: Text,
    AurSearch -> Text
_version :: Text,
    AurSearch -> Maybe Text
_description :: Maybe Text,
    -- | URL
    AurSearch -> Maybe Text
_url :: Maybe Text,
    AurSearch -> Int
_numVotes :: Int,
    AurSearch -> Double
_popularity :: Double,
    -- | UTCTime
    AurSearch -> Maybe Int
_outOfDate :: Maybe Int,
    AurSearch -> Maybe Text
_maintainer :: Maybe Text,
    -- | UTCTime
    AurSearch -> Int
_firstSubmitted :: Int,
    -- | UTCTime
    AurSearch -> Int
_lastModified :: Int,
    AurSearch -> Text
_urlPath :: Text
  }
  deriving stock (Int -> AurSearch -> String -> String
[AurSearch] -> String -> String
AurSearch -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [AurSearch] -> String -> String
$cshowList :: [AurSearch] -> String -> String
show :: AurSearch -> String
$cshow :: AurSearch -> String
showsPrec :: Int -> AurSearch -> String -> String
$cshowsPrec :: Int -> AurSearch -> String -> String
Show, AurSearch -> AurSearch -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AurSearch -> AurSearch -> Bool
$c/= :: AurSearch -> AurSearch -> Bool
== :: AurSearch -> AurSearch -> Bool
$c== :: AurSearch -> AurSearch -> Bool
Eq, Eq AurSearch
AurSearch -> AurSearch -> Bool
AurSearch -> AurSearch -> Ordering
AurSearch -> AurSearch -> AurSearch
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: AurSearch -> AurSearch -> AurSearch
$cmin :: AurSearch -> AurSearch -> AurSearch
max :: AurSearch -> AurSearch -> AurSearch
$cmax :: AurSearch -> AurSearch -> AurSearch
>= :: AurSearch -> AurSearch -> Bool
$c>= :: AurSearch -> AurSearch -> Bool
> :: AurSearch -> AurSearch -> Bool
$c> :: AurSearch -> AurSearch -> Bool
<= :: AurSearch -> AurSearch -> Bool
$c<= :: AurSearch -> AurSearch -> Bool
< :: AurSearch -> AurSearch -> Bool
$c< :: AurSearch -> AurSearch -> Bool
compare :: AurSearch -> AurSearch -> Ordering
$ccompare :: AurSearch -> AurSearch -> Ordering
Ord, forall x. Rep AurSearch x -> AurSearch
forall x. AurSearch -> Rep AurSearch x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AurSearch x -> AurSearch
$cfrom :: forall x. AurSearch -> Rep AurSearch x
Generic)
  deriving (Value -> Parser [AurSearch]
Value -> Parser AurSearch
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [AurSearch]
$cparseJSONList :: Value -> Parser [AurSearch]
parseJSON :: Value -> Parser AurSearch
$cparseJSON :: Value -> Parser AurSearch
FromJSON, [AurSearch] -> Encoding
[AurSearch] -> Value
AurSearch -> Encoding
AurSearch -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [AurSearch] -> Encoding
$ctoEncodingList :: [AurSearch] -> Encoding
toJSONList :: [AurSearch] -> Value
$ctoJSONList :: [AurSearch] -> Value
toEncoding :: AurSearch -> Encoding
$ctoEncoding :: AurSearch -> Encoding
toJSON :: AurSearch -> Value
$ctoJSON :: AurSearch -> Value
ToJSON) via AurJSON AurSearch

-- | Package details returned by 'Web.ArchLinux.API.getAurInfo'.
--
-- This data type extends 'AurSearch' informally,
-- so it includes '_search' as a member.
data AurInfo = AurInfo
  { -- | ID, Name, PackageBaseID, ...
    AurInfo -> AurSearch
_search :: AurSearch,
    -- | Depends
    AurInfo -> [Text]
_depends :: [Text],
    -- | MakeDepends
    AurInfo -> [Text]
_makedepends :: [Text],
    -- | OptDepends
    AurInfo -> [Text]
_optdepends :: [Text],
    -- | CheckDepends
    AurInfo -> [Text]
_checkdepends :: [Text],
    AurInfo -> [Text]
_conflicts :: [Text],
    AurInfo -> [Text]
_provides :: [Text],
    AurInfo -> [Text]
_replaces :: [Text],
    AurInfo -> [Text]
_groups :: [Text],
    AurInfo -> [License]
_licenses :: [License],
    AurInfo -> [Text]
_keywords :: [Text]
  }
  deriving stock (Int -> AurInfo -> String -> String
[AurInfo] -> String -> String
AurInfo -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [AurInfo] -> String -> String
$cshowList :: [AurInfo] -> String -> String
show :: AurInfo -> String
$cshow :: AurInfo -> String
showsPrec :: Int -> AurInfo -> String -> String
$cshowsPrec :: Int -> AurInfo -> String -> String
Show, AurInfo -> AurInfo -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AurInfo -> AurInfo -> Bool
$c/= :: AurInfo -> AurInfo -> Bool
== :: AurInfo -> AurInfo -> Bool
$c== :: AurInfo -> AurInfo -> Bool
Eq, Eq AurInfo
AurInfo -> AurInfo -> Bool
AurInfo -> AurInfo -> Ordering
AurInfo -> AurInfo -> AurInfo
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: AurInfo -> AurInfo -> AurInfo
$cmin :: AurInfo -> AurInfo -> AurInfo
max :: AurInfo -> AurInfo -> AurInfo
$cmax :: AurInfo -> AurInfo -> AurInfo
>= :: AurInfo -> AurInfo -> Bool
$c>= :: AurInfo -> AurInfo -> Bool
> :: AurInfo -> AurInfo -> Bool
$c> :: AurInfo -> AurInfo -> Bool
<= :: AurInfo -> AurInfo -> Bool
$c<= :: AurInfo -> AurInfo -> Bool
< :: AurInfo -> AurInfo -> Bool
$c< :: AurInfo -> AurInfo -> Bool
compare :: AurInfo -> AurInfo -> Ordering
$ccompare :: AurInfo -> AurInfo -> Ordering
Ord, forall x. Rep AurInfo x -> AurInfo
forall x. AurInfo -> Rep AurInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AurInfo x -> AurInfo
$cfrom :: forall x. AurInfo -> Rep AurInfo x
Generic)

instance FromJSON AurInfo where
  parseJSON :: Value -> Parser AurInfo
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"AurInfo" forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    AurSearch
_search <- forall a. FromJSON a => Value -> Parser a
parseJSON forall a b. (a -> b) -> a -> b
$ Object -> Value
Object Object
o
    [Text]
_depends <- forall a. a -> Maybe a -> a
fromMaybe [] forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"Depends"
    [Text]
_makedepends <- forall a. a -> Maybe a -> a
fromMaybe [] forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"MakeDepends"
    [Text]
_optdepends <- forall a. a -> Maybe a -> a
fromMaybe [] forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"OptDepends"
    [Text]
_checkdepends <- forall a. a -> Maybe a -> a
fromMaybe [] forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"CheckDepends"
    [Text]
_conflicts <- forall a. a -> Maybe a -> a
fromMaybe [] forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"Conflicts"
    [Text]
_provides <- forall a. a -> Maybe a -> a
fromMaybe [] forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"Provides"
    [Text]
_replaces <- forall a. a -> Maybe a -> a
fromMaybe [] forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"Replaces"
    [Text]
_groups <- forall a. a -> Maybe a -> a
fromMaybe [] forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"Groups"
    [License]
_licenses <- forall a. a -> Maybe a -> a
fromMaybe [] forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"License"
    [Text]
_keywords <- forall a. a -> Maybe a -> a
fromMaybe [] forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"Keywords"
    forall (f :: Type -> Type) a. Applicative f => a -> f a
pure AurInfo {[Text]
[License]
AurSearch
_keywords :: [Text]
_licenses :: [License]
_groups :: [Text]
_replaces :: [Text]
_provides :: [Text]
_conflicts :: [Text]
_checkdepends :: [Text]
_optdepends :: [Text]
_makedepends :: [Text]
_depends :: [Text]
_search :: AurSearch
$sel:_keywords:AurInfo :: [Text]
$sel:_licenses:AurInfo :: [License]
$sel:_groups:AurInfo :: [Text]
$sel:_replaces:AurInfo :: [Text]
$sel:_provides:AurInfo :: [Text]
$sel:_conflicts:AurInfo :: [Text]
$sel:_checkdepends:AurInfo :: [Text]
$sel:_optdepends:AurInfo :: [Text]
$sel:_makedepends:AurInfo :: [Text]
$sel:_depends:AurInfo :: [Text]
$sel:_search:AurInfo :: AurSearch
..}

instance ToJSON AurInfo where
  toJSON :: AurInfo -> Value
toJSON AurInfo {[Text]
[License]
AurSearch
_keywords :: [Text]
_licenses :: [License]
_groups :: [Text]
_replaces :: [Text]
_provides :: [Text]
_conflicts :: [Text]
_checkdepends :: [Text]
_optdepends :: [Text]
_makedepends :: [Text]
_depends :: [Text]
_search :: AurSearch
$sel:_keywords:AurInfo :: AurInfo -> [Text]
$sel:_licenses:AurInfo :: AurInfo -> [License]
$sel:_groups:AurInfo :: AurInfo -> [Text]
$sel:_replaces:AurInfo :: AurInfo -> [Text]
$sel:_provides:AurInfo :: AurInfo -> [Text]
$sel:_conflicts:AurInfo :: AurInfo -> [Text]
$sel:_checkdepends:AurInfo :: AurInfo -> [Text]
$sel:_optdepends:AurInfo :: AurInfo -> [Text]
$sel:_makedepends:AurInfo :: AurInfo -> [Text]
$sel:_depends:AurInfo :: AurInfo -> [Text]
$sel:_search:AurInfo :: AurInfo -> AurSearch
..} =
    Object -> Value
Object forall a b. (a -> b) -> a -> b
$
      Value -> Object
unObject (forall a. ToJSON a => a -> Value
toJSON AurSearch
_search)
        forall a. Semigroup a => a -> a -> a
<> Value -> Object
unObject
          ( [Pair] -> Value
object
              [ Key
"Depends" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Text]
_depends,
                Key
"MakeDepends" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Text]
_makedepends,
                Key
"OptDepends" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Text]
_optdepends,
                Key
"CheckDepends" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Text]
_checkdepends,
                Key
"Conflicts" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Text]
_conflicts,
                Key
"Provides" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Text]
_provides,
                Key
"Replaces" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Text]
_replaces,
                Key
"Groups" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Text]
_groups,
                Key
"License" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [License]
_licenses,
                Key
"Keywords" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Text]
_keywords
              ]
          )
    where
      unObject :: Value -> Object
unObject (Object Object
o) = Object
o
      unObject Value
_ = forall a. HasCallStack => String -> a
error String
"impossible"

-- | Return types of AUR API.
data AurResponseType = Search | Multiinfo | Error
  deriving stock (Int -> AurResponseType -> String -> String
[AurResponseType] -> String -> String
AurResponseType -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [AurResponseType] -> String -> String
$cshowList :: [AurResponseType] -> String -> String
show :: AurResponseType -> String
$cshow :: AurResponseType -> String
showsPrec :: Int -> AurResponseType -> String -> String
$cshowsPrec :: Int -> AurResponseType -> String -> String
Show, AurResponseType -> AurResponseType -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AurResponseType -> AurResponseType -> Bool
$c/= :: AurResponseType -> AurResponseType -> Bool
== :: AurResponseType -> AurResponseType -> Bool
$c== :: AurResponseType -> AurResponseType -> Bool
Eq, Eq AurResponseType
AurResponseType -> AurResponseType -> Bool
AurResponseType -> AurResponseType -> Ordering
AurResponseType -> AurResponseType -> AurResponseType
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: AurResponseType -> AurResponseType -> AurResponseType
$cmin :: AurResponseType -> AurResponseType -> AurResponseType
max :: AurResponseType -> AurResponseType -> AurResponseType
$cmax :: AurResponseType -> AurResponseType -> AurResponseType
>= :: AurResponseType -> AurResponseType -> Bool
$c>= :: AurResponseType -> AurResponseType -> Bool
> :: AurResponseType -> AurResponseType -> Bool
$c> :: AurResponseType -> AurResponseType -> Bool
<= :: AurResponseType -> AurResponseType -> Bool
$c<= :: AurResponseType -> AurResponseType -> Bool
< :: AurResponseType -> AurResponseType -> Bool
$c< :: AurResponseType -> AurResponseType -> Bool
compare :: AurResponseType -> AurResponseType -> Ordering
$ccompare :: AurResponseType -> AurResponseType -> Ordering
Ord, Int -> AurResponseType
AurResponseType -> Int
AurResponseType -> [AurResponseType]
AurResponseType -> AurResponseType
AurResponseType -> AurResponseType -> [AurResponseType]
AurResponseType
-> AurResponseType -> AurResponseType -> [AurResponseType]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: AurResponseType
-> AurResponseType -> AurResponseType -> [AurResponseType]
$cenumFromThenTo :: AurResponseType
-> AurResponseType -> AurResponseType -> [AurResponseType]
enumFromTo :: AurResponseType -> AurResponseType -> [AurResponseType]
$cenumFromTo :: AurResponseType -> AurResponseType -> [AurResponseType]
enumFromThen :: AurResponseType -> AurResponseType -> [AurResponseType]
$cenumFromThen :: AurResponseType -> AurResponseType -> [AurResponseType]
enumFrom :: AurResponseType -> [AurResponseType]
$cenumFrom :: AurResponseType -> [AurResponseType]
fromEnum :: AurResponseType -> Int
$cfromEnum :: AurResponseType -> Int
toEnum :: Int -> AurResponseType
$ctoEnum :: Int -> AurResponseType
pred :: AurResponseType -> AurResponseType
$cpred :: AurResponseType -> AurResponseType
succ :: AurResponseType -> AurResponseType
$csucc :: AurResponseType -> AurResponseType
Enum, forall x. Rep AurResponseType x -> AurResponseType
forall x. AurResponseType -> Rep AurResponseType x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AurResponseType x -> AurResponseType
$cfrom :: forall x. AurResponseType -> Rep AurResponseType x
Generic)
  deriving (Value -> Parser [AurResponseType]
Value -> Parser AurResponseType
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [AurResponseType]
$cparseJSONList :: Value -> Parser [AurResponseType]
parseJSON :: Value -> Parser AurResponseType
$cparseJSON :: Value -> Parser AurResponseType
FromJSON, [AurResponseType] -> Encoding
[AurResponseType] -> Value
AurResponseType -> Encoding
AurResponseType -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [AurResponseType] -> Encoding
$ctoEncodingList :: [AurResponseType] -> Encoding
toJSONList :: [AurResponseType] -> Value
$ctoJSONList :: [AurResponseType] -> Value
toEncoding :: AurResponseType -> Encoding
$ctoEncoding :: AurResponseType -> Encoding
toJSON :: AurResponseType -> Value
$ctoJSON :: AurResponseType -> Value
ToJSON) via CustomJSON '[ConstructorTagModifier CamelToSnake] AurResponseType

-- | Response data type of AUR API.
data AurResponse a = AurResponse
  { forall a. AurResponse a -> Int
_version :: Int,
    -- | type
    forall a. AurResponse a -> AurResponseType
_aurType :: AurResponseType,
    -- | resultcount
    forall a. AurResponse a -> Int
_resultCount :: Int,
    forall a. AurResponse a -> a
_results :: a,
    -- | Available when 'aurType' equals to 'AurResponseType.Error'.
    forall a. AurResponse a -> Maybe Text
_error :: Maybe Text
  }
  deriving stock (Int -> AurResponse a -> String -> String
forall a. Show a => Int -> AurResponse a -> String -> String
forall a. Show a => [AurResponse a] -> String -> String
forall a. Show a => AurResponse a -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [AurResponse a] -> String -> String
$cshowList :: forall a. Show a => [AurResponse a] -> String -> String
show :: AurResponse a -> String
$cshow :: forall a. Show a => AurResponse a -> String
showsPrec :: Int -> AurResponse a -> String -> String
$cshowsPrec :: forall a. Show a => Int -> AurResponse a -> String -> String
Show, AurResponse a -> AurResponse a -> Bool
forall a. Eq a => AurResponse a -> AurResponse a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AurResponse a -> AurResponse a -> Bool
$c/= :: forall a. Eq a => AurResponse a -> AurResponse a -> Bool
== :: AurResponse a -> AurResponse a -> Bool
$c== :: forall a. Eq a => AurResponse a -> AurResponse a -> Bool
Eq, AurResponse a -> AurResponse a -> Bool
AurResponse a -> AurResponse a -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a}. Ord a => Eq (AurResponse a)
forall a. Ord a => AurResponse a -> AurResponse a -> Bool
forall a. Ord a => AurResponse a -> AurResponse a -> Ordering
forall a. Ord a => AurResponse a -> AurResponse a -> AurResponse a
min :: AurResponse a -> AurResponse a -> AurResponse a
$cmin :: forall a. Ord a => AurResponse a -> AurResponse a -> AurResponse a
max :: AurResponse a -> AurResponse a -> AurResponse a
$cmax :: forall a. Ord a => AurResponse a -> AurResponse a -> AurResponse a
>= :: AurResponse a -> AurResponse a -> Bool
$c>= :: forall a. Ord a => AurResponse a -> AurResponse a -> Bool
> :: AurResponse a -> AurResponse a -> Bool
$c> :: forall a. Ord a => AurResponse a -> AurResponse a -> Bool
<= :: AurResponse a -> AurResponse a -> Bool
$c<= :: forall a. Ord a => AurResponse a -> AurResponse a -> Bool
< :: AurResponse a -> AurResponse a -> Bool
$c< :: forall a. Ord a => AurResponse a -> AurResponse a -> Bool
compare :: AurResponse a -> AurResponse a -> Ordering
$ccompare :: forall a. Ord a => AurResponse a -> AurResponse a -> Ordering
Ord, forall a b. a -> AurResponse b -> AurResponse a
forall a b. (a -> b) -> AurResponse a -> AurResponse b
forall (f :: Type -> Type).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> AurResponse b -> AurResponse a
$c<$ :: forall a b. a -> AurResponse b -> AurResponse a
fmap :: forall a b. (a -> b) -> AurResponse a -> AurResponse b
$cfmap :: forall a b. (a -> b) -> AurResponse a -> AurResponse b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (AurResponse a) x -> AurResponse a
forall a x. AurResponse a -> Rep (AurResponse a) x
$cto :: forall a x. Rep (AurResponse a) x -> AurResponse a
$cfrom :: forall a x. AurResponse a -> Rep (AurResponse a) x
Generic)

instance (FromJSON a) => FromJSON (AurResponse a) where
  parseJSON :: Value -> Parser (AurResponse a)
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"AurResponse" forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    Int
_version <- Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"version"
    AurResponseType
_aurType <- Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"type"
    Int
_resultCount <- Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"resultcount"
    a
_results <- Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"results"
    Maybe Text
_error <- Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"error"
    forall (f :: Type -> Type) a. Applicative f => a -> f a
pure AurResponse {a
Int
Maybe Text
AurResponseType
_error :: Maybe Text
_results :: a
_resultCount :: Int
_aurType :: AurResponseType
_version :: Int
$sel:_error:AurResponse :: Maybe Text
$sel:_results:AurResponse :: a
$sel:_resultCount:AurResponse :: Int
$sel:_aurType:AurResponse :: AurResponseType
$sel:_version:AurResponse :: Int
..}

instance (ToJSON a) => ToJSON (AurResponse a) where
  toJSON :: AurResponse a -> Value
toJSON AurResponse {a
Int
Maybe Text
AurResponseType
_error :: Maybe Text
_results :: a
_resultCount :: Int
_aurType :: AurResponseType
_version :: Int
$sel:_error:AurResponse :: forall a. AurResponse a -> Maybe Text
$sel:_results:AurResponse :: forall a. AurResponse a -> a
$sel:_resultCount:AurResponse :: forall a. AurResponse a -> Int
$sel:_aurType:AurResponse :: forall a. AurResponse a -> AurResponseType
$sel:_version:AurResponse :: forall a. AurResponse a -> Int
..} =
    [Pair] -> Value
object forall a b. (a -> b) -> a -> b
$
      [ Key
"version" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
_version,
        Key
"type" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= AurResponseType
_aurType,
        Key
"resultcount" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
_resultCount,
        Key
"results" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= a
_results
      ]
        forall a. Semigroup a => a -> a -> a
<> case Maybe Text
_error of
          Just Text
err -> [Key
"error" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Text
err]
          Maybe Text
_ -> []