private static IReadOnlyList <OnDeviceDecisioningRule> GetViewRules(OnDeviceDecisioningRuleSet ruleSet, ViewRequest viewRequest)
        {
            if (string.IsNullOrEmpty(viewRequest.Name))
            {
                return(ruleSet.Rules.Views.Values.SelectMany(list => list).ToList());
            }

            return(ruleSet.Rules.Views.TryGetValue(viewRequest.Name, out var result) ? result : null);
        }
 internal TraceHandler(
     TargetClientConfig clientConfig,
     IRuleLoader ruleLoader,
     OnDeviceDecisioningRuleSet ruleSet,
     TargetDeliveryRequest request)
 {
     this.ruleSet = ruleSet;
     this.trace   = new Dictionary <string, object>
     {
         { ClientCodeKey, clientConfig.Client },
         { ArtifactKey, this.ArtifactTrace(ruleLoader) },
         { ProfileKey, ProfileTrace(request.DeliveryRequest.Id) },
     };
     this.campaigns        = new Dictionary <long, IDictionary <string, object> >();
     this.evaluatedTargets = new Dictionary <long, IDictionary <string, object> >();
 }
 private static IReadOnlyList <OnDeviceDecisioningRule> GetPageLoadRules(OnDeviceDecisioningRuleSet ruleSet)
 {
     return(ruleSet.Rules.Mboxes.TryGetValue(ruleSet.GlobalMbox, out var result) ? result : null);
 }
 private static IReadOnlyList <OnDeviceDecisioningRule> GetMboxRules(OnDeviceDecisioningRuleSet ruleSet, MboxRequest mboxRequest)
 {
     return(ruleSet.Rules.Mboxes.TryGetValue(mboxRequest.Name, out var result) ? result : null);
 }
 private static IReadOnlyList <OnDeviceDecisioningRule> GetDetailsRules(RequestDetailsUnion details, OnDeviceDecisioningRuleSet ruleSet)
 {
     return(details.Match(
                _ => GetPageLoadRules(ruleSet),
                mboxRequest => GetMboxRules(ruleSet, mboxRequest),
                viewRequest => GetViewRules(ruleSet, viewRequest)));
 }
        public void ExecuteDetails(
            TargetDeliveryRequest deliveryRequest,
            IDictionary <string, object> localContext,
            string visitorId,
            ISet <string> responseTokens,
            TraceHandler traceHandler,
            OnDeviceDecisioningRuleSet ruleSet,
            RequestDetailsUnion details,
            PrefetchResponse prefetchResponse,
            ExecuteResponse executeResponse,
            IList <Notification> notifications)
        {
            traceHandler?.UpdateRequest(deliveryRequest, details, executeResponse != null);
            var rules = GetDetailsRules(details, ruleSet);

            if (rules == null)
            {
                UnhandledResponse(details, prefetchResponse, executeResponse, traceHandler);
                return;
            }

            var propertyToken      = deliveryRequest.DeliveryRequest.Property?.Token;
            var handledAtLeastOnce = false;
            var skipKeySet         = new HashSet <string>();

            foreach (var rule in rules)
            {
                if (PropertyTokenMismatch(rule.PropertyTokens, propertyToken))
                {
                    continue;
                }

                if (rule.RuleKey != null && skipKeySet.Contains(rule.RuleKey))
                {
                    continue;
                }

                var consequence = this.ruleExecutor.ExecuteRule(localContext, details, visitorId, rule, responseTokens, traceHandler);
                if (!HandleResult(consequence, rule, details, prefetchResponse, executeResponse, notifications, traceHandler, ruleSet.GlobalMbox))
                {
                    continue;
                }

                handledAtLeastOnce = true;
                if (rule.RuleKey != null)
                {
                    skipKeySet.Add(rule.RuleKey);
                }

                if (details.Match(
                        _ => false,
                        _ => true,
                        _ => false))
                {
                    break;
                }
            }

            if (!handledAtLeastOnce)
            {
                UnhandledResponse(details, prefetchResponse, executeResponse, traceHandler);
            }
        }