--------------------------------------------------------------------------------
-- 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 `MultiformatMessageString` type which is used to represent
-- messages in different formats, such as text or markdown.
module Data.SARIF.MultiformatMessageString (
    MultiformatMessageString(..),
    defaultMultiformatMessageString
) where

--------------------------------------------------------------------------------

import Data.Aeson.Optional
import Data.Text

--------------------------------------------------------------------------------

-- | Represents a message in at least textual representation, but also allowing
-- it to be provided in other formats such as markdown.
data MultiformatMessageString = MkMultiformatMessageString {
    -- | A textual representation of the message, which is mandatory.
    MultiformatMessageString -> Text
mmsText :: Text,
    -- | Optionally, a markdown representation of the message.
    MultiformatMessageString -> Maybe Text
mmsMarkdown :: Maybe Text
} deriving (MultiformatMessageString -> MultiformatMessageString -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MultiformatMessageString -> MultiformatMessageString -> Bool
$c/= :: MultiformatMessageString -> MultiformatMessageString -> Bool
== :: MultiformatMessageString -> MultiformatMessageString -> Bool
$c== :: MultiformatMessageString -> MultiformatMessageString -> Bool
Eq, Int -> MultiformatMessageString -> ShowS
[MultiformatMessageString] -> ShowS
MultiformatMessageString -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MultiformatMessageString] -> ShowS
$cshowList :: [MultiformatMessageString] -> ShowS
show :: MultiformatMessageString -> String
$cshow :: MultiformatMessageString -> String
showsPrec :: Int -> MultiformatMessageString -> ShowS
$cshowsPrec :: Int -> MultiformatMessageString -> ShowS
Show)

instance ToJSON MultiformatMessageString where
    toJSON :: MultiformatMessageString -> Value
toJSON MkMultiformatMessageString{Maybe Text
Text
mmsMarkdown :: Maybe Text
mmsText :: Text
mmsMarkdown :: MultiformatMessageString -> Maybe Text
mmsText :: MultiformatMessageString -> Text
..} = [Maybe Pair] -> Value
object
        [ Key
"text" forall a. ToJSON a => Key -> a -> Maybe Pair
.= Text
mmsText
        , Key
"markdown" forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Text
mmsMarkdown
        ]

instance FromJSON MultiformatMessageString where
    parseJSON :: Value -> Parser MultiformatMessageString
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MultiformatMessageString" forall a b. (a -> b) -> a -> b
$ \Object
obj ->
        Text -> Maybe Text -> MultiformatMessageString
MkMultiformatMessageString forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
obj forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"text"
                                   forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
obj forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"markdown"

-- | `defaultMultiformatMessageString` @messageText@ constructs a
-- `MultiformatMessageString` value where @messageText@ is the textual
-- representation of the message.
defaultMultiformatMessageString :: Text -> MultiformatMessageString
defaultMultiformatMessageString :: Text -> MultiformatMessageString
defaultMultiformatMessageString Text
text = MkMultiformatMessageString{
    mmsText :: Text
mmsText = Text
text,
    mmsMarkdown :: Maybe Text
mmsMarkdown = forall a. Maybe a
Nothing
}

--------------------------------------------------------------------------------