module LaunchDarkly.Server.Features where import Data.Aeson (FromJSON(..), ToJSON(..), Value(..), withObject, (.:), (.:?), object, (.=)) import Data.Text (Text) import Data.HashSet (HashSet) import Data.Generics.Product (getField) import GHC.Natural (Natural) import GHC.Generics (Generic) import LaunchDarkly.Server.Operators (Op) data Target = Target { values :: ![Text] , variation :: !Natural } deriving (Generic, FromJSON, ToJSON, Show, Eq) data Rule = Rule { id :: !Text , clauses :: ![Clause] , variationOrRollout :: !VariationOrRollout , trackEvents :: !Bool } deriving (Generic, Show, Eq) instance FromJSON Rule where parseJSON = withObject "Rule" $ \o -> do id <- o .: "id" clauses <- o .: "clauses" variation <- o .:? "variation" rollout <- o .:? "rollout" trackEvents <- o .: "trackEvents" pure Rule { id = id , clauses = clauses , variationOrRollout = VariationOrRollout { variation = variation , rollout = rollout } , trackEvents = trackEvents } instance ToJSON Rule where toJSON rule = object [ "id" .= getField @"id" rule , "clauses" .= getField @"clauses" rule , "trackEvents" .= getField @"trackEvents" rule , "variation" .= getField @"variation" (getField @"variationOrRollout" rule) , "rollout" .= getField @"rollout" (getField @"variationOrRollout" rule) ] data WeightedVariation = WeightedVariation { variation :: !Natural , weight :: !Float } deriving (Generic, FromJSON, ToJSON, Show, Eq) data Rollout = Rollout { variations :: ![WeightedVariation] , bucketBy :: !(Maybe Text) } deriving (Generic, FromJSON, ToJSON, Show, Eq) data VariationOrRollout = VariationOrRollout { variation :: !(Maybe Natural) , rollout :: !(Maybe Rollout) } deriving (Generic, FromJSON, ToJSON, Show, Eq) data Flag = Flag { key :: !Text , version :: !Natural , on :: !Bool , trackEvents :: !Bool , trackEventsFallthrough :: !Bool , deleted :: !Bool , prerequisites :: ![Prerequisite] , salt :: !Text , sel :: !Text , targets :: ![Target] , rules :: ![Rule] , fallthrough :: !VariationOrRollout , offVariation :: !(Maybe Natural) , variations :: ![Value] , debugEventsUntilDate :: !(Maybe Natural) } deriving (Generic, ToJSON, FromJSON, Show, Eq) data Prerequisite = Prerequisite { key :: !Text , variation :: !Natural } deriving (Generic, FromJSON, ToJSON, Show, Eq) data SegmentRule = SegmentRule { id :: !Text , clauses :: ![Clause] , weight :: !(Maybe Float) , bucketBy :: !(Maybe Text) } deriving (Generic, FromJSON, ToJSON, Show, Eq) data Segment = Segment { key :: !Text , included :: !(HashSet Text) , excluded :: !(HashSet Text) , salt :: !Text , rules :: ![SegmentRule] , version :: !Natural , deleted :: !Bool } deriving (Generic, FromJSON, ToJSON, Show, Eq) data Clause = Clause { attribute :: !Text , negate :: !Bool , op :: !Op , values :: ![Value] } deriving (Generic, FromJSON, ToJSON, Show, Eq)