{-# LANGUAGE OverloadedLists #-}
module LaunchDarkly.Server.Details where
import Data.Aeson.Types (Value(..), ToJSON, toJSON)
import Data.Text (Text)
import GHC.Exts (fromList)
import GHC.Natural (Natural)
import GHC.Generics (Generic)
data EvaluationDetail value = EvaluationDetail
{ value :: !value
, variationIndex :: !(Maybe Integer)
, reason :: !EvaluationReason
} deriving (Generic, Eq, Show)
instance ToJSON a => ToJSON (EvaluationDetail a) where
toJSON = toJSON
data EvaluationReason
= EvaluationReasonOff
| EvaluationReasonTargetMatch
| EvaluationReasonRuleMatch
{ ruleIndex :: !Natural
, ruleId :: !Text
, inExperiment :: !Bool
}
| EvaluationReasonPrerequisiteFailed
{ prerequisiteKey :: !Text
}
| EvaluationReasonFallthrough
{ inExperiment :: !Bool
}
| EvaluationReasonError
{ errorKind :: !EvalErrorKind
}
deriving (Generic, Eq, Show)
instance ToJSON EvaluationReason where
toJSON x = case x of
EvaluationReasonOff ->
Object $ fromList [("kind", "OFF")]
EvaluationReasonTargetMatch ->
Object $ fromList [("kind", "TARGET_MATCH")]
(EvaluationReasonRuleMatch ruleIndex ruleId True) ->
Object $ fromList [("kind", "RULE_MATCH"), ("ruleIndex", toJSON ruleIndex), ("ruleId", toJSON ruleId), ("inExperiment", toJSON True)]
(EvaluationReasonRuleMatch ruleIndex ruleId False) ->
Object $ fromList [("kind", "RULE_MATCH"), ("ruleIndex", toJSON ruleIndex), ("ruleId", toJSON ruleId)]
(EvaluationReasonPrerequisiteFailed prerequisiteKey) ->
Object $ fromList [("kind", "PREREQUISITE_FAILED"), ("prerequisiteKey", toJSON prerequisiteKey)]
EvaluationReasonFallthrough True ->
Object $ fromList [("kind", "FALLTHROUGH"), ("inExperiment", toJSON True)]
EvaluationReasonFallthrough False ->
Object $ fromList [("kind", "FALLTHROUGH")]
(EvaluationReasonError errorKind) ->
Object $ fromList [("kind", "ERROR"), ("errorKind", toJSON errorKind)]
isInExperiment :: EvaluationReason -> Bool
isInExperiment reason = case reason of
EvaluationReasonRuleMatch _ _ inExperiment -> inExperiment
EvaluationReasonFallthrough inExperiment -> inExperiment
_ -> False
data EvalErrorKind
= EvalErrorKindMalformedFlag
| EvalErrorFlagNotFound
| EvalErrorWrongType
| EvalErrorClientNotReady
| EvalErrorExternalStore !Text
deriving (Generic, Eq, Show)
instance ToJSON EvalErrorKind where
toJSON x = String $ case x of
EvalErrorKindMalformedFlag -> "MALFORMED_FLAG"
EvalErrorFlagNotFound -> "FLAG_NOT_FOUND"
EvalErrorWrongType -> "WRONG_TYPE"
EvalErrorClientNotReady -> "CLIENT_NOT_READY"
EvalErrorExternalStore _ -> "EXTERNAL_STORE_ERROR"