packages feed

sarif-0.2: src/Data/SARIF/Suppression.hs

--------------------------------------------------------------------------------
-- SARIF implementation for Haskell
--------------------------------------------------------------------------------
-- This source code is licensed under the MIT license found in the LICENSE    --
-- file in the root directory of this source tree.                            --
--------------------------------------------------------------------------------

-- | Provides the `Suppression` type to represent SARIF artifacts.
module Data.SARIF.Suppression (Suppression (..), SuppressionKind (..), SuppressionStatus (..)) where

import Data.Aeson.Optional
import Data.Map.Strict
import Data.SARIF.Location
import Data.Text
import Data.UUID.Types

data SuppressionKind
  = SuppressionInSourceKind
  | SuppressionExternalKind
  deriving (Eq, Ord, Show)

instance ToJSON SuppressionKind where
  toJSON SuppressionInSourceKind = String "inSource"
  toJSON SuppressionExternalKind = String "external"

instance FromJSON SuppressionKind where
  parseJSON = withText "SuppressionKind" $ \case
    "inSource" -> pure SuppressionInSourceKind
    "external" -> pure SuppressionExternalKind
    _ -> fail "Unknown SuppressionKind"

data SuppressionStatus
  = SuppressionAcceptedStatus
  | SuppressionRejectedStatus
  | SuppressionUnderReviewStatus
  deriving (Eq, Ord, Show)

instance ToJSON SuppressionStatus where
  toJSON SuppressionAcceptedStatus = String "accepted"
  toJSON SuppressionRejectedStatus = String "rejected"
  toJSON SuppressionUnderReviewStatus = String "underReview"

instance FromJSON SuppressionStatus where
  parseJSON = withText "SuppressionStatus" $ \case
    "accepted" -> pure SuppressionAcceptedStatus
    "rejected" -> pure SuppressionRejectedStatus
    "underReview" -> pure SuppressionUnderReviewStatus
    _ -> fail "Unknown SuppressionStatus"

data Suppression
  = MkSuppression
      { suppressionKind :: SuppressionKind
      , suppressionStatus :: Maybe SuppressionStatus
      , suppressionLocation :: Maybe Location
      , suppressionGUID :: Maybe UUID
      , suppressionJustification :: Maybe Text
      , suppressionProperties :: Maybe (Map Text Value)
      }
  deriving (Eq, Ord, Show)

instance ToJSON Suppression where
  toJSON MkSuppression {..} =
    object
      [ "kind" .= suppressionKind,
        "status" .=? suppressionStatus,
        "location" .=? suppressionLocation,
        "guid" .=? suppressionGUID,
        "justification" .=? suppressionJustification,
        "properties" .=? suppressionProperties
      ]

instance FromJSON Suppression where
  parseJSON = withObject "Suppression" $ \o ->
    MkSuppression
      <$> o .: "kind"
      <*> o .:? "status"
      <*> o .:? "location"
      <*> o .:? "guid"
      <*> o .:? "justification"
      <*> o .:? "properties"