{-# LANGUAGE NamedFieldPuns #-}
module LaunchDarkly.Server.Integrations.TestData.FlagBuilder
( FlagBuilder (..)
, VariationIndex
, newFlagBuilder
, booleanFlag
, on
, fallthroughVariation
, offVariation
, variationForAll
, variationForAllUsers
, valueForAll
, valueForAllUsers
, variationForKey
, variationForUser
, variations
, buildFlag
, ifMatch
, ifMatchContext
, ifNotMatch
, ifNotMatchContext
, FlagRuleBuilder
, andMatch
, andMatchContext
, andNotMatch
, andNotMatchContext
, thenReturn
, Variation
)
where
import qualified Data.Aeson as Aeson
import Data.Function ((&))
import Data.HashSet (HashSet)
import qualified Data.HashSet as HS
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import Data.Text (Text)
import qualified Data.Text as T
import GHC.Natural (Natural)
import qualified LaunchDarkly.Server.Features as F
import qualified LaunchDarkly.Server.Operators as Op
import LaunchDarkly.Server.Reference (makeReference)
type VariationIndex = Integer
trueVariationForBoolean, falseVariationForBoolean :: VariationIndex
trueVariationForBoolean :: Integer
trueVariationForBoolean = Integer
0
falseVariationForBoolean :: Integer
falseVariationForBoolean = Integer
1
variationForBoolean :: Bool -> VariationIndex
variationForBoolean :: Bool -> Integer
variationForBoolean Bool
True = Integer
trueVariationForBoolean
variationForBoolean Bool
False = Integer
falseVariationForBoolean
data FlagBuilder = FlagBuilder
{ FlagBuilder -> Text
fbKey :: Text
, FlagBuilder -> Maybe Integer
fbOffVariation :: Maybe VariationIndex
, FlagBuilder -> Bool
fbOn :: Bool
, FlagBuilder -> Maybe Integer
fbFallthroughVariation :: Maybe VariationIndex
, FlagBuilder -> [Value]
fbVariations :: [Aeson.Value]
, FlagBuilder -> Map Text (Map Integer (HashSet Text))
fbTargetMap :: Map Text (Map VariationIndex (HashSet Text))
, FlagBuilder -> [FlagRule]
fbRules :: [FlagRule]
}
deriving (Int -> FlagBuilder -> ShowS
[FlagBuilder] -> ShowS
FlagBuilder -> String
(Int -> FlagBuilder -> ShowS)
-> (FlagBuilder -> String)
-> ([FlagBuilder] -> ShowS)
-> Show FlagBuilder
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FlagBuilder -> ShowS
showsPrec :: Int -> FlagBuilder -> ShowS
$cshow :: FlagBuilder -> String
show :: FlagBuilder -> String
$cshowList :: [FlagBuilder] -> ShowS
showList :: [FlagBuilder] -> ShowS
Show)
fbTargets :: FlagBuilder -> ([F.Target], [F.Target])
fbTargets :: FlagBuilder -> ([Target], [Target])
fbTargets FlagBuilder {$sel:fbTargetMap:FlagBuilder :: FlagBuilder -> Map Text (Map Integer (HashSet Text))
fbTargetMap = Map Text (Map Integer (HashSet Text))
targetMap} =
(([Target], [Target])
-> Text -> Map Integer (HashSet Text) -> ([Target], [Target]))
-> ([Target], [Target])
-> Map Text (Map Integer (HashSet Text))
-> ([Target], [Target])
forall a k b. (a -> k -> b -> a) -> a -> Map k b -> a
Map.foldlWithKey ([Target], [Target])
-> Text -> Map Integer (HashSet Text) -> ([Target], [Target])
splitIntoTargets ([], []) Map Text (Map Integer (HashSet Text))
targetMap
where
splitIntoTargets :: ([F.Target], [F.Target]) -> Text -> Map VariationIndex (HashSet Text) -> ([F.Target], [F.Target])
splitIntoTargets :: ([Target], [Target])
-> Text -> Map Integer (HashSet Text) -> ([Target], [Target])
splitIntoTargets ([Target], [Target])
acc Text
"user" Map Integer (HashSet Text)
keyMap = (([Target], [Target])
-> Integer -> HashSet Text -> ([Target], [Target]))
-> ([Target], [Target])
-> Map Integer (HashSet Text)
-> ([Target], [Target])
forall a k b. (a -> k -> b -> a) -> a -> Map k b -> a
Map.foldlWithKey ([Target], [Target])
-> Integer -> HashSet Text -> ([Target], [Target])
foldForUserKind ([Target], [Target])
acc Map Integer (HashSet Text)
keyMap
splitIntoTargets ([Target], [Target])
acc Text
kind Map Integer (HashSet Text)
keyMap = (([Target], [Target])
-> Integer -> HashSet Text -> ([Target], [Target]))
-> ([Target], [Target])
-> Map Integer (HashSet Text)
-> ([Target], [Target])
forall a k b. (a -> k -> b -> a) -> a -> Map k b -> a
Map.foldlWithKey (Text
-> ([Target], [Target])
-> Integer
-> HashSet Text
-> ([Target], [Target])
foldForOtherKind Text
kind) ([Target], [Target])
acc Map Integer (HashSet Text)
keyMap
foldForUserKind :: ([F.Target], [F.Target]) -> VariationIndex -> HashSet Text -> ([F.Target], [F.Target])
foldForUserKind :: ([Target], [Target])
-> Integer -> HashSet Text -> ([Target], [Target])
foldForUserKind ([Target]
userTargets, [Target]
allTargets) Integer
variation HashSet Text
values =
( F.Target {HashSet Text
values :: HashSet Text
$sel:values:Target :: HashSet Text
values, Integer
variation :: Integer
$sel:variation:Target :: Integer
variation, $sel:contextKind:Target :: Text
contextKind = Text
"user"} Target -> [Target] -> [Target]
forall a. a -> [a] -> [a]
: [Target]
userTargets
, F.Target {$sel:values:Target :: HashSet Text
values = HashSet Text
forall a. Monoid a => a
mempty, Integer
variation :: Integer
$sel:variation:Target :: Integer
variation, $sel:contextKind:Target :: Text
contextKind = Text
"user"} Target -> [Target] -> [Target]
forall a. a -> [a] -> [a]
: [Target]
allTargets
)
foldForOtherKind :: Text -> ([F.Target], [F.Target]) -> VariationIndex -> HashSet Text -> ([F.Target], [F.Target])
foldForOtherKind :: Text
-> ([Target], [Target])
-> Integer
-> HashSet Text
-> ([Target], [Target])
foldForOtherKind Text
kind ([Target]
userTargets, [Target]
allTargets) Integer
variation HashSet Text
values =
( [Target]
userTargets
, F.Target {$sel:values:Target :: HashSet Text
values = HashSet Text
values, Integer
$sel:variation:Target :: Integer
variation :: Integer
variation, $sel:contextKind:Target :: Text
contextKind = Text
kind} Target -> [Target] -> [Target]
forall a. a -> [a] -> [a]
: [Target]
allTargets
)
buildFlag :: Natural -> FlagBuilder -> F.Flag
buildFlag :: Natural -> FlagBuilder -> Flag
buildFlag Natural
version FlagBuilder
flagBuilder =
F.Flag
{ $sel:key:Flag :: Text
F.key = FlagBuilder -> Text
fbKey FlagBuilder
flagBuilder
, $sel:version:Flag :: Natural
F.version = Natural
version
, $sel:on:Flag :: Bool
F.on = FlagBuilder -> Bool
fbOn FlagBuilder
flagBuilder
, $sel:trackEvents:Flag :: Bool
F.trackEvents = Bool
False
, $sel:trackEventsFallthrough:Flag :: Bool
F.trackEventsFallthrough = Bool
False
, $sel:deleted:Flag :: Bool
F.deleted = Bool
False
, $sel:prerequisites:Flag :: [Prerequisite]
F.prerequisites = []
, $sel:salt:Flag :: Text
F.salt = Text
"salt"
, $sel:targets:Flag :: [Target]
F.targets = [Target]
userTargets
, $sel:contextTargets:Flag :: [Target]
F.contextTargets = [Target]
allTargets
, $sel:rules:Flag :: [Rule]
F.rules = (Integer -> FlagRule -> Rule) -> [FlagRule] -> [Rule]
forall num a b. Integral num => (num -> a -> b) -> [a] -> [b]
mapWithIndex Integer -> FlagRule -> Rule
convertFlagRule (FlagBuilder -> [FlagRule]
fbRules FlagBuilder
flagBuilder)
, $sel:fallthrough:Flag :: VariationOrRollout
F.fallthrough = Maybe Integer -> Maybe Rollout -> VariationOrRollout
F.VariationOrRollout (FlagBuilder -> Maybe Integer
fbFallthroughVariation FlagBuilder
flagBuilder) Maybe Rollout
forall a. Maybe a
Nothing
, $sel:offVariation:Flag :: Maybe Integer
F.offVariation = FlagBuilder -> Maybe Integer
fbOffVariation FlagBuilder
flagBuilder
, $sel:variations:Flag :: [Value]
F.variations = FlagBuilder -> [Value]
fbVariations FlagBuilder
flagBuilder
, $sel:debugEventsUntilDate:Flag :: Maybe Natural
F.debugEventsUntilDate = Maybe Natural
forall a. Maybe a
Nothing
, $sel:clientSideAvailability:Flag :: ClientSideAvailability
F.clientSideAvailability = Bool -> Bool -> Bool -> ClientSideAvailability
F.ClientSideAvailability Bool
False Bool
False Bool
False
}
where
([Target]
userTargets, [Target]
allTargets) = FlagBuilder -> ([Target], [Target])
fbTargets FlagBuilder
flagBuilder
mapWithIndex :: Integral num => (num -> a -> b) -> [a] -> [b]
mapWithIndex :: forall num a b. Integral num => (num -> a -> b) -> [a] -> [b]
mapWithIndex num -> a -> b
f [a]
l =
((num, a) -> b) -> [(num, a)] -> [b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((num -> a -> b) -> (num, a) -> b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry num -> a -> b
f) ([num] -> [a] -> [(num, a)]
forall a b. [a] -> [b] -> [(a, b)]
zip [num
0 ..] [a]
l)
newFlagBuilder :: Text -> FlagBuilder
newFlagBuilder :: Text -> FlagBuilder
newFlagBuilder Text
key =
FlagBuilder
{ $sel:fbKey:FlagBuilder :: Text
fbKey = Text
key
, $sel:fbOffVariation:FlagBuilder :: Maybe Integer
fbOffVariation = Maybe Integer
forall a. Maybe a
Nothing
, $sel:fbOn:FlagBuilder :: Bool
fbOn = Bool
True
, $sel:fbFallthroughVariation:FlagBuilder :: Maybe Integer
fbFallthroughVariation = Maybe Integer
forall a. Maybe a
Nothing
, $sel:fbVariations:FlagBuilder :: [Value]
fbVariations = [Value]
forall a. Monoid a => a
mempty
, $sel:fbTargetMap:FlagBuilder :: Map Text (Map Integer (HashSet Text))
fbTargetMap = Map Text (Map Integer (HashSet Text))
forall a. Monoid a => a
mempty
, $sel:fbRules:FlagBuilder :: [FlagRule]
fbRules = [FlagRule]
forall a. Monoid a => a
mempty
}
booleanFlagVariations :: [Aeson.Value]
booleanFlagVariations :: [Value]
booleanFlagVariations = [Bool -> Value
Aeson.Bool Bool
True, Bool -> Value
Aeson.Bool Bool
False]
isBooleanFlag :: FlagBuilder -> Bool
isBooleanFlag :: FlagBuilder -> Bool
isBooleanFlag FlagBuilder
flagBuilder
| [Value]
booleanFlagVariations [Value] -> [Value] -> Bool
forall a. Eq a => a -> a -> Bool
== FlagBuilder -> [Value]
fbVariations FlagBuilder
flagBuilder = Bool
True
| Bool
otherwise = Bool
False
booleanFlag :: FlagBuilder -> FlagBuilder
booleanFlag :: FlagBuilder -> FlagBuilder
booleanFlag FlagBuilder
flagBuilder
| FlagBuilder -> Bool
isBooleanFlag FlagBuilder
flagBuilder =
FlagBuilder
flagBuilder
| Bool
otherwise =
FlagBuilder
flagBuilder
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& [Value] -> FlagBuilder -> FlagBuilder
variations [Value]
booleanFlagVariations
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Integer -> FlagBuilder -> FlagBuilder
forall val. Variation val => val -> FlagBuilder -> FlagBuilder
fallthroughVariation Integer
trueVariationForBoolean
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Integer -> FlagBuilder -> FlagBuilder
forall val. Variation val => val -> FlagBuilder -> FlagBuilder
offVariation Integer
falseVariationForBoolean
on ::
Bool ->
FlagBuilder ->
FlagBuilder
on :: Bool -> FlagBuilder -> FlagBuilder
on Bool
isOn FlagBuilder
fb =
FlagBuilder
fb {fbOn = isOn}
clearRules :: FlagBuilder -> FlagBuilder
clearRules :: FlagBuilder -> FlagBuilder
clearRules FlagBuilder
fb =
FlagBuilder
fb {fbRules = mempty}
clearTargets :: FlagBuilder -> FlagBuilder
clearTargets :: FlagBuilder -> FlagBuilder
clearTargets FlagBuilder
fb =
FlagBuilder
fb {fbTargetMap = mempty}
valueForAll ::
Aeson.ToJSON value =>
value ->
FlagBuilder ->
FlagBuilder
valueForAll :: forall value. ToJSON value => value -> FlagBuilder -> FlagBuilder
valueForAll value
val FlagBuilder
fb =
FlagBuilder
fb
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& [Value] -> FlagBuilder -> FlagBuilder
variations [value -> Value
forall a. ToJSON a => a -> Value
Aeson.toJSON value
val]
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Integer -> FlagBuilder -> FlagBuilder
forall val. Variation val => val -> FlagBuilder -> FlagBuilder
variationForAll (Integer
0 :: VariationIndex)
{-# DEPRECATED valueForAllUsers "Use valueForAll instead" #-}
valueForAllUsers ::
Aeson.ToJSON value =>
value ->
FlagBuilder ->
FlagBuilder
valueForAllUsers :: forall value. ToJSON value => value -> FlagBuilder -> FlagBuilder
valueForAllUsers = value -> FlagBuilder -> FlagBuilder
forall value. ToJSON value => value -> FlagBuilder -> FlagBuilder
valueForAll
variations ::
[Aeson.Value] ->
FlagBuilder ->
FlagBuilder
variations :: [Value] -> FlagBuilder -> FlagBuilder
variations [Value]
values FlagBuilder
fb =
FlagBuilder
fb {fbVariations = values}
class Variation val where
fallthroughVariation ::
val ->
FlagBuilder ->
FlagBuilder
offVariation ::
val ->
FlagBuilder ->
FlagBuilder
variationForAll ::
val ->
FlagBuilder ->
FlagBuilder
variationForAllUsers ::
val ->
FlagBuilder ->
FlagBuilder
variationForKey ::
Text ->
Text ->
val ->
FlagBuilder ->
FlagBuilder
variationForUser ::
Text ->
val ->
FlagBuilder ->
FlagBuilder
thenReturn ::
val ->
FlagRuleBuilder ->
FlagBuilder
instance Variation Integer where
fallthroughVariation :: Integer -> FlagBuilder -> FlagBuilder
fallthroughVariation Integer
variationIndex FlagBuilder
fb =
FlagBuilder
fb {fbFallthroughVariation = Just variationIndex}
offVariation :: Integer -> FlagBuilder -> FlagBuilder
offVariation Integer
variationIndex FlagBuilder
fb =
FlagBuilder
fb {fbOffVariation = Just variationIndex}
variationForAll :: Integer -> FlagBuilder -> FlagBuilder
variationForAll Integer
variationIndex FlagBuilder
fb =
FlagBuilder
fb
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Bool -> FlagBuilder -> FlagBuilder
on Bool
True
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& FlagBuilder -> FlagBuilder
clearRules
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& FlagBuilder -> FlagBuilder
clearTargets
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Integer -> FlagBuilder -> FlagBuilder
forall val. Variation val => val -> FlagBuilder -> FlagBuilder
fallthroughVariation Integer
variationIndex
variationForAllUsers :: Integer -> FlagBuilder -> FlagBuilder
variationForAllUsers = Integer -> FlagBuilder -> FlagBuilder
forall val. Variation val => val -> FlagBuilder -> FlagBuilder
variationForAll
variationForKey :: Text -> Text -> Integer -> FlagBuilder -> FlagBuilder
variationForKey Text
kind Text
key Integer
variationIndex fb :: FlagBuilder
fb@(FlagBuilder {$sel:fbTargetMap:FlagBuilder :: FlagBuilder -> Map Text (Map Integer (HashSet Text))
fbTargetMap = Map Text (Map Integer (HashSet Text))
targetMap}) =
case Text
-> Map Text (Map Integer (HashSet Text))
-> Maybe (Map Integer (HashSet Text))
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Text
kind Map Text (Map Integer (HashSet Text))
targetMap of
Maybe (Map Integer (HashSet Text))
Nothing -> FlagBuilder
fb {fbTargetMap = Map.insert kind (Map.singleton variationIndex $ HS.singleton key) targetMap}
Just Map Integer (HashSet Text)
m ->
case Integer -> Map Integer (HashSet Text) -> Maybe (HashSet Text)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Integer
variationIndex Map Integer (HashSet Text)
m of
Maybe (HashSet Text)
Nothing -> FlagBuilder
fb {fbTargetMap = Map.insert kind (Map.insert variationIndex (HS.singleton key) m) targetMap}
Just HashSet Text
keys -> FlagBuilder
fb {fbTargetMap = Map.insert kind (Map.insert variationIndex (HS.insert key keys) m) targetMap}
variationForUser :: Text -> Integer -> FlagBuilder -> FlagBuilder
variationForUser = Text -> Text -> Integer -> FlagBuilder -> FlagBuilder
forall val.
Variation val =>
Text -> Text -> val -> FlagBuilder -> FlagBuilder
variationForKey Text
"user"
thenReturn :: Integer -> FlagRuleBuilder -> FlagBuilder
thenReturn Integer
variationIndex FlagRuleBuilder
ruleBuilder =
let fb :: FlagBuilder
fb = FlagRuleBuilder -> FlagBuilder
frbBaseBuilder FlagRuleBuilder
ruleBuilder
in FlagBuilder
fb {fbRules = FlagRule (frbClauses ruleBuilder) variationIndex : fbRules fb}
instance Variation Bool where
fallthroughVariation :: Bool -> FlagBuilder -> FlagBuilder
fallthroughVariation Bool
value FlagBuilder
fb =
FlagBuilder
fb
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& FlagBuilder -> FlagBuilder
booleanFlag
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Integer -> FlagBuilder -> FlagBuilder
forall val. Variation val => val -> FlagBuilder -> FlagBuilder
fallthroughVariation (Bool -> Integer
variationForBoolean Bool
value)
offVariation :: Bool -> FlagBuilder -> FlagBuilder
offVariation Bool
value FlagBuilder
fb =
FlagBuilder
fb
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& FlagBuilder -> FlagBuilder
booleanFlag
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Integer -> FlagBuilder -> FlagBuilder
forall val. Variation val => val -> FlagBuilder -> FlagBuilder
offVariation (Bool -> Integer
variationForBoolean Bool
value)
variationForAll :: Bool -> FlagBuilder -> FlagBuilder
variationForAll Bool
value FlagBuilder
fb =
FlagBuilder
fb
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& FlagBuilder -> FlagBuilder
booleanFlag
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Integer -> FlagBuilder -> FlagBuilder
forall val. Variation val => val -> FlagBuilder -> FlagBuilder
variationForAll (Bool -> Integer
variationForBoolean Bool
value)
variationForAllUsers :: Bool -> FlagBuilder -> FlagBuilder
variationForAllUsers = Bool -> FlagBuilder -> FlagBuilder
forall val. Variation val => val -> FlagBuilder -> FlagBuilder
variationForAll
variationForKey :: Text -> Text -> Bool -> FlagBuilder -> FlagBuilder
variationForKey Text
kind Text
key Bool
value FlagBuilder
fb =
FlagBuilder
fb
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& FlagBuilder -> FlagBuilder
booleanFlag
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Text -> Text -> Integer -> FlagBuilder -> FlagBuilder
forall val.
Variation val =>
Text -> Text -> val -> FlagBuilder -> FlagBuilder
variationForKey Text
kind Text
key (Bool -> Integer
variationForBoolean Bool
value)
variationForUser :: Text -> Bool -> FlagBuilder -> FlagBuilder
variationForUser Text
userKey Bool
value FlagBuilder
fb =
FlagBuilder
fb
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& FlagBuilder -> FlagBuilder
booleanFlag
FlagBuilder -> (FlagBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Text -> Integer -> FlagBuilder -> FlagBuilder
forall val.
Variation val =>
Text -> val -> FlagBuilder -> FlagBuilder
variationForUser Text
userKey (Bool -> Integer
variationForBoolean Bool
value)
thenReturn :: Bool -> FlagRuleBuilder -> FlagBuilder
thenReturn Bool
value FlagRuleBuilder
ruleBuilder =
FlagRuleBuilder
ruleBuilder {frbBaseBuilder = booleanFlag $ frbBaseBuilder ruleBuilder}
FlagRuleBuilder -> (FlagRuleBuilder -> FlagBuilder) -> FlagBuilder
forall a b. a -> (a -> b) -> b
& Integer -> FlagRuleBuilder -> FlagBuilder
forall val. Variation val => val -> FlagRuleBuilder -> FlagBuilder
thenReturn (Bool -> Integer
variationForBoolean Bool
value)
ifMatchContext ::
Text ->
Text ->
[Aeson.Value] ->
FlagBuilder ->
FlagRuleBuilder
ifMatchContext :: Text -> Text -> [Value] -> FlagBuilder -> FlagRuleBuilder
ifMatchContext Text
kind Text
attribute [Value]
values FlagBuilder
fb =
FlagBuilder -> FlagRuleBuilder
newFlagRuleBuilder FlagBuilder
fb
FlagRuleBuilder
-> (FlagRuleBuilder -> FlagRuleBuilder) -> FlagRuleBuilder
forall a b. a -> (a -> b) -> b
& Text -> Text -> [Value] -> FlagRuleBuilder -> FlagRuleBuilder
andMatchContext Text
kind Text
attribute [Value]
values
{-# DEPRECATED ifMatch "Use ifMatchContext instead" #-}
ifMatch ::
Text ->
[Aeson.Value] ->
FlagBuilder ->
FlagRuleBuilder
ifMatch :: Text -> [Value] -> FlagBuilder -> FlagRuleBuilder
ifMatch = Text -> Text -> [Value] -> FlagBuilder -> FlagRuleBuilder
ifMatchContext Text
"user"
ifNotMatchContext ::
Text ->
Text ->
[Aeson.Value] ->
FlagBuilder ->
FlagRuleBuilder
ifNotMatchContext :: Text -> Text -> [Value] -> FlagBuilder -> FlagRuleBuilder
ifNotMatchContext Text
kind Text
attibute [Value]
values FlagBuilder
fb =
FlagBuilder -> FlagRuleBuilder
newFlagRuleBuilder FlagBuilder
fb
FlagRuleBuilder
-> (FlagRuleBuilder -> FlagRuleBuilder) -> FlagRuleBuilder
forall a b. a -> (a -> b) -> b
& Text -> Text -> [Value] -> FlagRuleBuilder -> FlagRuleBuilder
andNotMatchContext Text
kind Text
attibute [Value]
values
{-# DEPRECATED ifNotMatch "Use ifNotMatchContext instead" #-}
ifNotMatch ::
Text ->
[Aeson.Value] ->
FlagBuilder ->
FlagRuleBuilder
ifNotMatch :: Text -> [Value] -> FlagBuilder -> FlagRuleBuilder
ifNotMatch = Text -> Text -> [Value] -> FlagBuilder -> FlagRuleBuilder
ifNotMatchContext Text
"user"
data Clause = Clause
{ Clause -> Text
clauseAttribute :: Text
, Clause -> Text
contextKind :: Text
, Clause -> [Value]
clauseValues :: [Aeson.Value]
, Clause -> Bool
clauseNegate :: Bool
}
deriving (Int -> Clause -> ShowS
[Clause] -> ShowS
Clause -> String
(Int -> Clause -> ShowS)
-> (Clause -> String) -> ([Clause] -> ShowS) -> Show Clause
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Clause -> ShowS
showsPrec :: Int -> Clause -> ShowS
$cshow :: Clause -> String
show :: Clause -> String
$cshowList :: [Clause] -> ShowS
showList :: [Clause] -> ShowS
Show)
data FlagRule = FlagRule
{ FlagRule -> [Clause]
frClauses :: [Clause]
, FlagRule -> Integer
frVariation :: VariationIndex
}
deriving (Int -> FlagRule -> ShowS
[FlagRule] -> ShowS
FlagRule -> String
(Int -> FlagRule -> ShowS)
-> (FlagRule -> String) -> ([FlagRule] -> ShowS) -> Show FlagRule
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FlagRule -> ShowS
showsPrec :: Int -> FlagRule -> ShowS
$cshow :: FlagRule -> String
show :: FlagRule -> String
$cshowList :: [FlagRule] -> ShowS
showList :: [FlagRule] -> ShowS
Show)
convertFlagRule :: Integer -> FlagRule -> F.Rule
convertFlagRule :: Integer -> FlagRule -> Rule
convertFlagRule Integer
idx FlagRule
flagRule =
F.Rule
{ $sel:id:Rule :: Text
F.id = String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
"rule" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Integer -> String
forall a. Show a => a -> String
show Integer
idx
, $sel:variationOrRollout:Rule :: VariationOrRollout
F.variationOrRollout = Maybe Integer -> Maybe Rollout -> VariationOrRollout
F.VariationOrRollout (Integer -> Maybe Integer
forall a. a -> Maybe a
Just (Integer -> Maybe Integer) -> Integer -> Maybe Integer
forall a b. (a -> b) -> a -> b
$ FlagRule -> Integer
frVariation FlagRule
flagRule) Maybe Rollout
forall a. Maybe a
Nothing
, $sel:clauses:Rule :: [Clause]
F.clauses = (Clause -> Clause) -> [Clause] -> [Clause]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Clause -> Clause
convertClause (FlagRule -> [Clause]
frClauses FlagRule
flagRule)
, $sel:trackEvents:Rule :: Bool
F.trackEvents = Bool
False
}
convertClause :: Clause -> F.Clause
convertClause :: Clause -> Clause
convertClause Clause
clause =
F.Clause
{ $sel:attribute:Clause :: Reference
F.attribute = Text -> Reference
makeReference (Text -> Reference) -> Text -> Reference
forall a b. (a -> b) -> a -> b
$ Clause -> Text
clauseAttribute Clause
clause
, $sel:contextKind:Clause :: Text
F.contextKind = Clause -> Text
contextKind Clause
clause
, $sel:negate:Clause :: Bool
F.negate = Clause -> Bool
clauseNegate Clause
clause
, $sel:values:Clause :: [Value]
F.values = Clause -> [Value]
clauseValues Clause
clause
, $sel:op:Clause :: Op
F.op = Op
Op.OpIn
}
data FlagRuleBuilder = FlagRuleBuilder
{ FlagRuleBuilder -> [Clause]
frbClauses :: [Clause]
, FlagRuleBuilder -> FlagBuilder
frbBaseBuilder :: FlagBuilder
}
deriving (Int -> FlagRuleBuilder -> ShowS
[FlagRuleBuilder] -> ShowS
FlagRuleBuilder -> String
(Int -> FlagRuleBuilder -> ShowS)
-> (FlagRuleBuilder -> String)
-> ([FlagRuleBuilder] -> ShowS)
-> Show FlagRuleBuilder
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FlagRuleBuilder -> ShowS
showsPrec :: Int -> FlagRuleBuilder -> ShowS
$cshow :: FlagRuleBuilder -> String
show :: FlagRuleBuilder -> String
$cshowList :: [FlagRuleBuilder] -> ShowS
showList :: [FlagRuleBuilder] -> ShowS
Show)
newFlagRuleBuilder :: FlagBuilder -> FlagRuleBuilder
newFlagRuleBuilder :: FlagBuilder -> FlagRuleBuilder
newFlagRuleBuilder FlagBuilder
baseBuilder =
FlagRuleBuilder
{ $sel:frbClauses:FlagRuleBuilder :: [Clause]
frbClauses = [Clause]
forall a. Monoid a => a
mempty
, $sel:frbBaseBuilder:FlagRuleBuilder :: FlagBuilder
frbBaseBuilder = FlagBuilder
baseBuilder
}
andMatchContext ::
Text ->
Text ->
[Aeson.Value] ->
FlagRuleBuilder ->
FlagRuleBuilder
andMatchContext :: Text -> Text -> [Value] -> FlagRuleBuilder -> FlagRuleBuilder
andMatchContext Text
kind Text
attribute [Value]
values FlagRuleBuilder
ruleBuilder =
FlagRuleBuilder
ruleBuilder {frbClauses = Clause attribute kind values False : frbClauses ruleBuilder}
{-# DEPRECATED andMatch "Use andMatchContext instead" #-}
andMatch ::
Text ->
[Aeson.Value] ->
FlagRuleBuilder ->
FlagRuleBuilder
andMatch :: Text -> [Value] -> FlagRuleBuilder -> FlagRuleBuilder
andMatch = Text -> Text -> [Value] -> FlagRuleBuilder -> FlagRuleBuilder
andMatchContext Text
"user"
andNotMatchContext ::
Text ->
Text ->
[Aeson.Value] ->
FlagRuleBuilder ->
FlagRuleBuilder
andNotMatchContext :: Text -> Text -> [Value] -> FlagRuleBuilder -> FlagRuleBuilder
andNotMatchContext Text
kind Text
attribute [Value]
values FlagRuleBuilder
ruleBuilder =
FlagRuleBuilder
ruleBuilder {frbClauses = Clause attribute kind values True : frbClauses ruleBuilder}
{-# DEPRECATED andNotMatch "Use andNotMatchContext instead" #-}
andNotMatch ::
Text ->
[Aeson.Value] ->
FlagRuleBuilder ->
FlagRuleBuilder
andNotMatch :: Text -> [Value] -> FlagRuleBuilder -> FlagRuleBuilder
andNotMatch = Text -> Text -> [Value] -> FlagRuleBuilder -> FlagRuleBuilder
andNotMatchContext Text
"user"
{-# DEPRECATED variationForAllUsers "Use variationForAll instead" #-}
{-# DEPRECATED variationForUser "Use variationForKey instead" #-}