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)); }
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)); }
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); } }
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); }
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); }