module GitHub.Data.Checks ( Check (..), CheckStatus (..), CheckConclusion (..), CheckOutput (..), CheckAnnotation (..), CheckAnnotationLevel (..), CheckImage (..), CheckAction (..), ) where import Data.Aeson import Data.Aeson.Types import Data.Text (Text) import Data.Vector (Vector) import GHC.Generics (Generic) import GitHub import GitHub.Internal.Prelude (UTCTime) data Check = Check { checkName :: !(Name Check) , checkSha :: !(Name Commit) , checkDetailsURL :: !(Maybe URL) , checkExternalId :: !(Maybe (Id Check)) , checkStatus :: !(Maybe CheckStatus) , checkStartedAt :: !(Maybe UTCTime) , checkConclusion :: !(Maybe CheckConclusion) , checkCompletedAt :: !(Maybe UTCTime) , checkOutput :: !(Maybe CheckOutput) , checkActions :: !(Maybe (Vector CheckAction)) } deriving stock (Show, Eq, Ord, Generic) instance ToJSON Check where toJSON (Check n sha durl eid s sa c ca o a) = object' [ "name" .= n , "head_sha" .= sha , "details_url" .= durl , "external_id" .= eid , "status" .= s , "started_at" .= sa , "conclusion" .= c , "completed_at" .= ca , "output" .= o , "actions" .= a ] data CheckStatus = CheckQueued | CheckInProgress | CheckCompleted deriving stock (Show, Enum, Bounded, Eq, Ord, Generic) instance ToJSON CheckStatus where toJSON CheckQueued = String "queued" toJSON CheckInProgress = String "in_progress" toJSON CheckCompleted = String "completed" data CheckConclusion = CheckActionRequired | CheckCancelled | CheckFailure | CheckNeutral | CheckSuccess | CheckSkipped | CheckStale | CheckTimedOut deriving stock (Show, Enum, Bounded, Eq, Ord, Generic) instance ToJSON CheckConclusion where toJSON CheckActionRequired = String "action_required" toJSON CheckCancelled = String "cancelled" toJSON CheckFailure = String "failure" toJSON CheckNeutral = String "neutral" toJSON CheckSuccess = String "success" toJSON CheckSkipped = String "skipped" toJSON CheckStale = String "stale" toJSON CheckTimedOut = String "timed_out" data CheckOutput = CheckOutput { checkTitle :: !Text , checkSummary :: !Text , checkText :: !(Maybe Text) , checkAnnotations :: !(Maybe (Vector CheckAnnotation)) , checkImages :: !(Maybe (Vector CheckImage)) } deriving stock (Show, Eq, Ord, Generic) instance ToJSON CheckOutput where toJSON (CheckOutput t s txt a i) = object' [ "title" .= t , "summary" .= s , "text" .= txt , "annotations" .= a , "images" .= i ] data CheckAnnotation = CheckAnnotation { checkPath :: !Text , checkStartLine :: !Int , checkEndLine :: !Int , checkStartColumn :: !(Maybe Int) , checkEndColumn :: !(Maybe Int) , checkAnnotationLevel :: !CheckAnnotationLevel , checkMessage :: !Text , checkTitle :: !(Maybe Text) , checkRawDetails :: !(Maybe Text) } deriving stock (Show, Eq, Ord, Generic) instance ToJSON CheckAnnotation where toJSON (CheckAnnotation p sl el sc ec al m t rd) = object' [ "path" .= p , "start_line" .= sl , "end_line" .= el , "start_column" .= sc , "end_column" .= ec , "annotation_level" .= al , "message" .= m , "title" .= t , "raw_details" .= rd ] data CheckAnnotationLevel = NoticeAnnotation | WarningAnnotation | FailureAnnotation deriving stock (Show, Enum, Bounded, Eq, Ord, Generic) instance ToJSON CheckAnnotationLevel where toJSON NoticeAnnotation = String "notice" toJSON WarningAnnotation = String "warning" toJSON FailureAnnotation = String "failure" data CheckImage = CheckImage { checkImageAlt :: !Text , checkImageURL :: !URL , checkImageCaption :: !(Maybe Text) } deriving stock (Show, Eq, Ord, Generic) instance ToJSON CheckImage where toJSON (CheckImage a url c) = object' [ "alt" .= a , "image_url" .= url , "caption" .= c ] data CheckAction = CheckAction { checkActionLabel :: !Text , checkActionDescription :: !Text , checkActionIdentifier :: !Text } deriving stock (Show, Eq, Ord, Generic) instance ToJSON CheckAction where toJSON (CheckAction l d i) = object' [ "label" .= l , "description" .= d , "identifier" .= i ] object' :: [Pair] -> Value object' = object . filter notNull where notNull (_, Null) = False notNull (_, _) = True