packages feed

gerrit-0.1.2.0: src/Gerrit/Data/Project.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE OverloadedStrings #-}

module Gerrit.Data.Project
  ( GerritProjectInfo (..),
    GerritProjectQuery (..),
    projectQS,
    GerritProjectsMessage,
  )
where

import Data.Aeson
import Data.Aeson.Casing (aesonPrefix, snakeCase)
import Data.Map
import Data.Text (Text, intercalate, pack)
import GHC.Generics (Generic)

data GerritProjectQuery = Regexp Text | Prefix Text
  deriving (Eq, Show)

queryText :: GerritProjectQuery -> Text
queryText (Regexp re) = "r=" <> re
queryText (Prefix prefix) = "p=" <> prefix

-- >>> projectQS 10 (Regexp "test/.*|rpms/.*") Nothing
-- "r:test/.*|rpms/.*&n=10"
projectQS :: Int -> GerritProjectQuery -> Maybe Int -> Text
projectQS count query startM =
  intercalate "&" [qtString, countString] <> startString
  where
    qtString = queryText query
    countString = "n=" <> pack (show count)
    startString = maybe mempty (\s -> "&S=" <> pack (show s)) startM

newtype GerritProjectInfo = GerritProjectInfo
  {gerritprojectinfoId :: Text}
  deriving (Eq, Show, Generic)

type GerritProjectsMessage = Map Text GerritProjectInfo

instance FromJSON GerritProjectInfo where
  parseJSON = genericParseJSON $ aesonPrefix snakeCase