using DotWhat.Contracts; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; using Cocona; namespace DotWhat { class Program { private static readonly IEnumerable Whats = Assembly.GetExecutingAssembly() .GetTypes() .Where(type => type.BaseType == typeof(What)) .Select(what => (What)Activator.CreateInstance(what)); private static async Task Main(string[] args) { await CoconaLiteApp.RunAsync(args); return 0; } public async Task StartAsync([Argument] string name = default) { if (string.IsNullOrEmpty(name)) { Console.WriteLine("No what passed. Current available whats are:"); PrintWhats(); return; } var command = Whats.FirstOrDefault(what => what.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); if (command is null) { Console.WriteLine("Invalid what passed. Current available whats are:"); PrintWhats(); return; } await command.RunAsync(); static void PrintWhats() => Whats.ToList().ForEach(what => Console.WriteLine(what.Name.ToLower())); } } }