static int Run(RunOptions opts) { var configs = LoadConfiguration(opts.ConfigFile); if (!ValidateConfiguration(configs)) { return(2); } var nodes = new List <Plugin>(); foreach (var config in configs) { var node = PluginFactory.FromConfiguration(config); nodes.Add(node); } foreach (var node in nodes) { var upstreams = node.Configuration.Upstreams; if (upstreams != null) { foreach (var target in upstreams) { if (target == null) { continue; } var pattern = $"^{target.Replace(@"\.", @"\.").Replace(@"\*", @".*").Replace(@"\?", ".") }$"; var expr = new Regex(pattern); foreach (var upstream in nodes.FindAll(n => expr.IsMatch(n.Name))) { if (node == upstream) { continue; } upstream.Subscribe(node); } } } } foreach (var node in nodes) { System.Console.WriteLine($"Starting {node.Name}"); node.Run(); } System.Console.WriteLine("Running!"); System.Console.ReadLine(); return(0); }