{-# LANGUAGE LambdaCase #-}

module GitHub.Request.Display
    ( DisplayGitHubRequest
    , displayGitHubRequest
    )
where

import Prelude

import Data.Text (Text, pack)
import qualified Data.Text as T
import Data.Text.Encoding (decodeUtf8)
import GitHub.Request
import RIO (Display)

newtype DisplayGitHubRequest = DisplayGitHubRequest
    { DisplayGitHubRequest -> Text
_unDisplayGitHubRequest :: Text
    }
    deriving newtype (DisplayGitHubRequest -> DisplayGitHubRequest -> Bool
(DisplayGitHubRequest -> DisplayGitHubRequest -> Bool)
-> (DisplayGitHubRequest -> DisplayGitHubRequest -> Bool)
-> Eq DisplayGitHubRequest
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DisplayGitHubRequest -> DisplayGitHubRequest -> Bool
$c/= :: DisplayGitHubRequest -> DisplayGitHubRequest -> Bool
== :: DisplayGitHubRequest -> DisplayGitHubRequest -> Bool
$c== :: DisplayGitHubRequest -> DisplayGitHubRequest -> Bool
Eq, Int -> DisplayGitHubRequest -> ShowS
[DisplayGitHubRequest] -> ShowS
DisplayGitHubRequest -> String
(Int -> DisplayGitHubRequest -> ShowS)
-> (DisplayGitHubRequest -> String)
-> ([DisplayGitHubRequest] -> ShowS)
-> Show DisplayGitHubRequest
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DisplayGitHubRequest] -> ShowS
$cshowList :: [DisplayGitHubRequest] -> ShowS
show :: DisplayGitHubRequest -> String
$cshow :: DisplayGitHubRequest -> String
showsPrec :: Int -> DisplayGitHubRequest -> ShowS
$cshowsPrec :: Int -> DisplayGitHubRequest -> ShowS
Show, DisplayGitHubRequest -> Text
DisplayGitHubRequest -> Utf8Builder
(DisplayGitHubRequest -> Utf8Builder)
-> (DisplayGitHubRequest -> Text) -> Display DisplayGitHubRequest
forall a. (a -> Utf8Builder) -> (a -> Text) -> Display a
textDisplay :: DisplayGitHubRequest -> Text
$ctextDisplay :: DisplayGitHubRequest -> Text
display :: DisplayGitHubRequest -> Utf8Builder
$cdisplay :: DisplayGitHubRequest -> Utf8Builder
Display)

displayGitHubRequest :: GenRequest m k a -> DisplayGitHubRequest
displayGitHubRequest :: GenRequest m k a -> DisplayGitHubRequest
displayGitHubRequest = Text -> DisplayGitHubRequest
DisplayGitHubRequest (Text -> DisplayGitHubRequest)
-> (GenRequest m k a -> Text)
-> GenRequest m k a
-> DisplayGitHubRequest
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
    Query ps :: Paths
ps qs :: QueryString
qs -> Paths -> Text
forall a. Monoid a => [a] -> a
mconcat
        [ "[GET] "
        , "/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Paths -> Text
T.intercalate "/" Paths
ps
        , "?" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Paths -> Text
T.intercalate "&" (QueryString -> Paths
queryParts QueryString
qs)
        ]
    PagedQuery ps :: Paths
ps qs :: QueryString
qs fc :: FetchCount
fc -> Paths -> Text
forall a. Monoid a => [a] -> a
mconcat
        [ "[GET] "
        , "/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Paths -> Text
T.intercalate "/" Paths
ps
        , "?" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Paths -> Text
T.intercalate "&" (QueryString -> Paths
queryParts QueryString
qs)
        , " (" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
pack (FetchCount -> String
forall a. Show a => a -> String
show FetchCount
fc) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ")"
        ]
    Command m :: CommandMethod
m ps :: Paths
ps _body :: ByteString
_body ->
        Paths -> Text
forall a. Monoid a => [a] -> a
mconcat
            [ "[" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Text
T.toUpper (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ CommandMethod -> String
forall a. Show a => a -> String
show CommandMethod
m) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> "] "
            , "/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Paths -> Text
T.intercalate "/" Paths
ps
            ]

queryParts :: QueryString -> [Text]
queryParts :: QueryString -> Paths
queryParts = ((ByteString, Maybe ByteString) -> Text) -> QueryString -> Paths
forall a b. (a -> b) -> [a] -> [b]
map (((ByteString, Maybe ByteString) -> Text) -> QueryString -> Paths)
-> ((ByteString, Maybe ByteString) -> Text) -> QueryString -> Paths
forall a b. (a -> b) -> a -> b
$ \(k :: ByteString
k, mv :: Maybe ByteString
mv) -> ByteString -> Text
decodeUtf8 ByteString
k Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> "=" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> (ByteString -> Text) -> Maybe ByteString -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe "" ByteString -> Text
decodeUtf8 Maybe ByteString
mv