static void Main(string[] args) { var tsolvers = Assembly.GetEntryAssembly() !.GetTypes() .Where(t => t.GetTypeInfo().IsClass&& typeof(Solver).IsAssignableFrom(t)) .OrderBy(t => t.FullName) .ToArray(); var action = // Generate solution template for [year]/[day] Command(args, Args("update", "([0-9]+)/([0-9]+)"), m => { var year = int.Parse(m[1]); var day = int.Parse(m[2]); return(() => new Updater().Update(year, day).Wait()); }) ?? Command(args, Args("([0-9]+)/([0-9]+)"), m => { var year = int.Parse(m[0]); var day = int.Parse(m[1]); var tSolversSelected = tsolvers.First(tSolver => SolverExtensions.Year(tSolver) == year && SolverExtensions.Day(tSolver) == day); return(() => Runner.RunAll(tSolversSelected)); }) ?? Command(args, Args("[0-9]+"), m => { var year = int.Parse(m[0]); var tSolversSelected = tsolvers.Where(tSolver => SolverExtensions.Year(tSolver) == year); return(() => Runner.RunAll(tSolversSelected.ToArray())); }) ?? Command(args, Args("last"), m => { var tSolversSelected = tsolvers.Last(); return(() => Runner.RunAll(tSolversSelected)); }) ?? Command(args, Args("all"), m => { return(() => Runner.RunAll(tsolvers)); }) ?? new Action(() => { Console.WriteLine(Usage.Get()); }); action(); }
static void Main(string[] args) { var usageProvider = new ApplicationUsage(); var entryAssembly = Assembly.GetEntryAssembly(); var files = Directory.EnumerateFiles(Path.GetDirectoryName(entryAssembly.Location), "solutions.dll"); var assemblies = files.Select(f => AssemblyLoadContext.Default.LoadFromAssemblyPath(f)).ToList(); assemblies.Add(typeof(Program).Assembly); var tsolvers = assemblies.SelectMany(a => a.GetTypes()) .Where(t => t.GetTypeInfo().IsClass&& typeof(ISolver).IsAssignableFrom(t)) .OrderBy(t => t.FullName) .ToArray(); var action = Command(args, Args("update", "([0-9]+)/([0-9]+)"), m => { var year = int.Parse(m[1]); var day = int.Parse(m[2]); return(() => new Updater().Update(year, day, tsolvers, usageProvider).Wait()); }) ?? Command(args, Args("update", "last"), m => { var dt = DateTime.Now; if (dt.Month == 12 && dt.Day >= 1 && dt.Day <= 25) { return(() => new Updater().Update(dt.Year, dt.Day, tsolvers, usageProvider).Wait()); } else { throw new Exception("Event is not active. This option works in Dec 1-25 only)"); } }) ?? Command(args, Args("([0-9]+)/([0-9]+)"), m => { var year = int.Parse(m[0]); var day = int.Parse(m[1]); var tsolversSelected = tsolvers.First(tsolver => SolverExtensions.Year(tsolver) == year && SolverExtensions.Day(tsolver) == day); return(() => Runner.RunAll(tsolversSelected)); }) ?? Command(args, Args("[0-9]+"), m => { var year = int.Parse(m[0]); var tsolversSelected = tsolvers.Where(tsolver => SolverExtensions.Year(tsolver) == year); return(() => Runner.RunAll(tsolversSelected.ToArray())); }) ?? Command(args, Args("([0-9]+)/last"), m => { var year = int.Parse(m[0]); var tsolversSelected = tsolvers.Last(tsolver => SolverExtensions.Year(tsolver) == year); return(() => Runner.RunAll(tsolversSelected)); }) ?? Command(args, Args("([0-9]+)/all"), m => { var year = int.Parse(m[0]); var tsolversSelected = tsolvers.Where(tsolver => SolverExtensions.Year(tsolver) == year); return(() => Runner.RunAll(tsolversSelected.ToArray())); }) ?? Command(args, Args("all"), m => { return(() => Runner.RunAll(tsolvers)); }) ?? Command(args, Args("last"), m => { var tsolversSelected = tsolvers.Last(); return(() => Runner.RunAll(tsolversSelected)); }) ?? new Action(() => { Console.WriteLine(usageProvider.Usage()); }); action(); }