module GitHub.Data.Reviews where

import GitHub.Data.Definitions (SimpleUser)
import GitHub.Data.Id (Id)
import GitHub.Data.URL (URL)
import GitHub.Internal.Prelude
import Prelude ()

import qualified Data.Text as T

data ReviewState
    = ReviewStatePending
    | ReviewStateApproved
    | ReviewStateDismissed
    | ReviewStateCommented
    | ReviewStateChangesRequested
    deriving (Int -> ReviewState -> ShowS
[ReviewState] -> ShowS
ReviewState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ReviewState] -> ShowS
$cshowList :: [ReviewState] -> ShowS
show :: ReviewState -> String
$cshow :: ReviewState -> String
showsPrec :: Int -> ReviewState -> ShowS
$cshowsPrec :: Int -> ReviewState -> ShowS
Show, Int -> ReviewState
ReviewState -> Int
ReviewState -> [ReviewState]
ReviewState -> ReviewState
ReviewState -> ReviewState -> [ReviewState]
ReviewState -> ReviewState -> ReviewState -> [ReviewState]
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 :: ReviewState -> ReviewState -> ReviewState -> [ReviewState]
$cenumFromThenTo :: ReviewState -> ReviewState -> ReviewState -> [ReviewState]
enumFromTo :: ReviewState -> ReviewState -> [ReviewState]
$cenumFromTo :: ReviewState -> ReviewState -> [ReviewState]
enumFromThen :: ReviewState -> ReviewState -> [ReviewState]
$cenumFromThen :: ReviewState -> ReviewState -> [ReviewState]
enumFrom :: ReviewState -> [ReviewState]
$cenumFrom :: ReviewState -> [ReviewState]
fromEnum :: ReviewState -> Int
$cfromEnum :: ReviewState -> Int
toEnum :: Int -> ReviewState
$ctoEnum :: Int -> ReviewState
pred :: ReviewState -> ReviewState
$cpred :: ReviewState -> ReviewState
succ :: ReviewState -> ReviewState
$csucc :: ReviewState -> ReviewState
Enum, ReviewState
forall a. a -> a -> Bounded a
maxBound :: ReviewState
$cmaxBound :: ReviewState
minBound :: ReviewState
$cminBound :: ReviewState
Bounded, ReviewState -> ReviewState -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ReviewState -> ReviewState -> Bool
$c/= :: ReviewState -> ReviewState -> Bool
== :: ReviewState -> ReviewState -> Bool
$c== :: ReviewState -> ReviewState -> Bool
Eq, Eq ReviewState
ReviewState -> ReviewState -> Bool
ReviewState -> ReviewState -> Ordering
ReviewState -> ReviewState -> ReviewState
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 :: ReviewState -> ReviewState -> ReviewState
$cmin :: ReviewState -> ReviewState -> ReviewState
max :: ReviewState -> ReviewState -> ReviewState
$cmax :: ReviewState -> ReviewState -> ReviewState
>= :: ReviewState -> ReviewState -> Bool
$c>= :: ReviewState -> ReviewState -> Bool
> :: ReviewState -> ReviewState -> Bool
$c> :: ReviewState -> ReviewState -> Bool
<= :: ReviewState -> ReviewState -> Bool
$c<= :: ReviewState -> ReviewState -> Bool
< :: ReviewState -> ReviewState -> Bool
$c< :: ReviewState -> ReviewState -> Bool
compare :: ReviewState -> ReviewState -> Ordering
$ccompare :: ReviewState -> ReviewState -> Ordering
Ord, forall x. Rep ReviewState x -> ReviewState
forall x. ReviewState -> Rep ReviewState x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ReviewState x -> ReviewState
$cfrom :: forall x. ReviewState -> Rep ReviewState x
Generic)

instance NFData ReviewState where
    rnf :: ReviewState -> ()
rnf = forall a. (Generic a, GNFData (Rep a)) => a -> ()
genericRnf

instance Binary ReviewState

instance FromJSON ReviewState where
    parseJSON :: Value -> Parser ReviewState
parseJSON = forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"ReviewState" forall a b. (a -> b) -> a -> b
$ \Text
t -> case Text -> Text
T.toLower Text
t of
        Text
"approved"          -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ReviewState
ReviewStateApproved
        Text
"pending"           -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ReviewState
ReviewStatePending
        Text
"dismissed"         -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ReviewState
ReviewStateDismissed
        Text
"commented"         -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ReviewState
ReviewStateCommented
        Text
"changes_requested" -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ReviewState
ReviewStateChangesRequested
        Text
_                   -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall a b. (a -> b) -> a -> b
$ String
"Unknown ReviewState: " forall a. Semigroup a => a -> a -> a
<> Text -> String
T.unpack Text
t

data Review = Review
    { Review -> Text
reviewBody :: !Text
    , Review -> Text
reviewCommitId :: !Text
    , Review -> ReviewState
reviewState :: ReviewState
    , Review -> Maybe UTCTime
reviewSubmittedAt :: !(Maybe UTCTime)
    , Review -> URL
reviewPullRequestUrl :: !URL
    , Review -> Text
reviewHtmlUrl :: !Text
    , Review -> SimpleUser
reviewUser :: !SimpleUser
    , Review -> Id Review
reviewId :: !(Id Review)
    } deriving (Int -> Review -> ShowS
[Review] -> ShowS
Review -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Review] -> ShowS
$cshowList :: [Review] -> ShowS
show :: Review -> String
$cshow :: Review -> String
showsPrec :: Int -> Review -> ShowS
$cshowsPrec :: Int -> Review -> ShowS
Show, forall x. Rep Review x -> Review
forall x. Review -> Rep Review x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Review x -> Review
$cfrom :: forall x. Review -> Rep Review x
Generic)

instance NFData Review where
    rnf :: Review -> ()
rnf = forall a. (Generic a, GNFData (Rep a)) => a -> ()
genericRnf

instance Binary Review

instance FromJSON Review where
    parseJSON :: Value -> Parser Review
parseJSON =
        forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Review" forall a b. (a -> b) -> a -> b
$ \Object
o ->
            Text
-> Text
-> ReviewState
-> Maybe UTCTime
-> URL
-> Text
-> SimpleUser
-> Id Review
-> Review
Review forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"body" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"commit_id" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"state" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"submitted_at" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            Object
o forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"pull_request_url" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            Object
o forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"html_url" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            Object
o forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"user" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            Object
o forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"id"

data ReviewComment = ReviewComment
    { ReviewComment -> Id ReviewComment
reviewCommentId :: !(Id ReviewComment)
    , ReviewComment -> SimpleUser
reviewCommentUser :: !SimpleUser
    , ReviewComment -> Text
reviewCommentBody :: !Text
    , ReviewComment -> URL
reviewCommentUrl :: !URL
    , ReviewComment -> Id Review
reviewCommentPullRequestReviewId :: !(Id Review)
    , ReviewComment -> Text
reviewCommentDiffHunk :: !Text
    , ReviewComment -> Text
reviewCommentPath :: !Text
    , ReviewComment -> Int
reviewCommentPosition :: !Int
    , ReviewComment -> Int
reviewCommentOriginalPosition :: !Int
    , ReviewComment -> Text
reviewCommentCommitId :: !Text
    , ReviewComment -> Text
reviewCommentOriginalCommitId :: !Text
    , ReviewComment -> UTCTime
reviewCommentCreatedAt :: !UTCTime
    , ReviewComment -> UTCTime
reviewCommentUpdatedAt :: !UTCTime
    , ReviewComment -> URL
reviewCommentHtmlUrl :: !URL
    , ReviewComment -> URL
reviewCommentPullRequestUrl :: !URL
    } deriving (Int -> ReviewComment -> ShowS
[ReviewComment] -> ShowS
ReviewComment -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ReviewComment] -> ShowS
$cshowList :: [ReviewComment] -> ShowS
show :: ReviewComment -> String
$cshow :: ReviewComment -> String
showsPrec :: Int -> ReviewComment -> ShowS
$cshowsPrec :: Int -> ReviewComment -> ShowS
Show, forall x. Rep ReviewComment x -> ReviewComment
forall x. ReviewComment -> Rep ReviewComment x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ReviewComment x -> ReviewComment
$cfrom :: forall x. ReviewComment -> Rep ReviewComment x
Generic)

instance NFData ReviewComment where
    rnf :: ReviewComment -> ()
rnf = forall a. (Generic a, GNFData (Rep a)) => a -> ()
genericRnf

instance Binary ReviewComment

instance FromJSON ReviewComment where
    parseJSON :: Value -> Parser ReviewComment
parseJSON =
        forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ReviewComment" forall a b. (a -> b) -> a -> b
$ \Object
o -> Id ReviewComment
-> SimpleUser
-> Text
-> URL
-> Id Review
-> Text
-> Text
-> Int
-> Int
-> Text
-> Text
-> UTCTime
-> UTCTime
-> URL
-> URL
-> ReviewComment
ReviewComment
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"user"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"body"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"url"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"pull_request_review_id"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"diff_hunk"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"path"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"position"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"original_position"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"commit_id"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"original_commit_id"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"created_at"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"updated_at"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"html_url"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"pull_request_url"