{-# LANGUAGE DeriveGeneric #-}

{-|
    Module      : Rollbar.Item.CodeVersion
    Description : Metadata for describing versions of software
    Copyright   : (c) Hardy Jones, 2017
    License     : BSD3
    Maintainer  : jones3.hardy@gmail.com
    Stability   : experimental
-}

module Rollbar.Item.CodeVersion
    ( CodeVersion(..)
    ) where

import Data.Aeson (ToJSON, toEncoding, toJSON)

import GHC.Generics (Generic)

import qualified Data.Text as T

-- | Rollbar supports different ways to say what version the code is.
data CodeVersion
    -- | Good ole SemVer.
    --  It's 'T.Text' because who knows if you actually got it right...
    = SemVer T.Text
    -- | Plain integers.
    | Number Int
    -- | Should be a Git SHA.
    | SHA T.Text
    deriving (Eq, Generic, Show)

prettyCodeVersion :: CodeVersion -> T.Text
prettyCodeVersion (SemVer s) = s
prettyCodeVersion (Number n) = T.pack . show $ n
prettyCodeVersion (SHA h)    = h

instance ToJSON CodeVersion where
    toJSON = toJSON . prettyCodeVersion
    toEncoding = toEncoding . prettyCodeVersion