Esempio n. 1
0
        private static async Task <bool> Validate(IDictionary <string, RuleDefinition> rules, GetRuleParser parserResolver)
        {
            var parsingTask = Task.Run(() =>
            {
                try
                {
                    RulesLoader.Parse(rules, parserResolver);
                    return(true);
                }
                catch (Exception)
                {
                    return(false);
                }
            });

            var dependencyCheckingTask = Task.Run(() => !DependencyChecker.HasCircularDependencies(rules));

            await Task.WhenAll(parsingTask, dependencyCheckingTask);

            return((await parsingTask) && (await dependencyCheckingTask));
        }
Esempio n. 2
0
 public static ValidationDelegate GetValidationDelegate(GetRuleParser parserResolver) => rules => Validate(rules, parserResolver);
        public static async Task <ITweek> Create(IRulesRepository rulesRepository, GetRuleParser parserResolver)
        {
            var rulesLoader = await RulesLoader.Factory(rulesRepository, parserResolver);

            return(new TweekRunner(rulesLoader));
        }
Esempio n. 4
0
        public static (GetRule, PathExpander) Parse(IDictionary <string, RuleDefinition> rules, GetRuleParser parserResolver)
        {
            var tree = new RadixTree <IRule>(rules.ToDictionary(x => x.Key.ToLower(), x => parserResolver(x.Value.Format).Parse(x.Value.Payload)));

            Option <IRule> RulesRepository(ConfigurationPath path) => tree.TryGetValue(path, out var rule) ? Option <IRule> .Some(rule) : Option <IRule> .None;

            IEnumerable <ConfigurationPath> PathExpander(ConfigurationPath path)
            {
                if (!path.IsScan)
                {
                    return new[] { path }
                }
                ;

                var keys = path == ConfigurationPath.FullScan
                    ? tree.Keys
                    : tree.ListPrefix($"{path.Folder}/").Select(c => c.key);

                return(keys.Select(ConfigurationPath.New).Where(x => !x.IsHidden(path.Folder)));
            }

            return(RulesRepository, PathExpander);
        }
    }
Esempio n. 5
0
        public static async Task <Func <(GetRule, PathExpander)> > Factory(IRulesRepository repository, GetRuleParser parserResolver)
        {
            (GetRule, PathExpander)? instance = null;
            repository.OnRulesChange         += (newRules) =>
            {
                using (TraceHelpers.TraceTime("loading new rules"))
                {
                    instance = Parse(newRules, parserResolver);
                }
            };
            var initRepo = Parse(await repository.GetAllRules(), parserResolver);

            instance = instance ?? initRepo;
            return(() => instance.Value);
        }
Esempio n. 6
0
        public static async Task <Func <(RulesRepository, PathExpander)> > Factory(IRulesDriver driver, GetRuleParser parserResolver)
        {
            var instance = Parse(await driver.GetAllRules(), parserResolver);

            driver.OnRulesChange += (newRules) =>
            {
                using (TraceTime("loading new rules"))
                {
                    instance = Parse(newRules, parserResolver);
                }
            };
            return(() => instance);
        }