/// <summary> /// Entry point for code generation process. /// </summary> /// <param name="args">List of arguments.</param> /// <exception cref="ArgumentException"></exception> /// <exception cref="ArgumentOutOfRangeException"></exception> public static void SourceToSource(string[] args) { var logger = new LoggerFactory() // TODO Handle Logging // .AddConsole() .CreateLogger <CodeGenerator>(); using (new AssemblyResolver()) { var cmd = new CodeGeneratorCommand { Log = logger }; var argsFile = args[0].Trim('"'); if (!File.Exists(argsFile)) { throw new ArgumentException($"Arguments file \"{argsFile}\" does not exist."); } var fileArgs = File.ReadAllLines(argsFile); foreach (var arg in fileArgs) { var parts = arg.Split(new[] { ':' }, 2); if (parts.Length > 2) { throw new ArgumentException($"Argument \"{arg}\" cannot be parsed."); } var key = parts[0]; var value = parts.Skip(1).SingleOrDefault(); switch (key) { case "WaitForDebugger": var i = 0; while (!Debugger.IsAttached) { if (i++ % 50 == 0) { Console.WriteLine("Waiting for debugger to attach."); } Thread.Sleep(100); } break; case nameof(cmd.ProjectGuid): cmd.ProjectGuid = value; break; case nameof(cmd.ProjectPath): cmd.ProjectPath = value; break; case nameof(cmd.OutputType): cmd.OutputType = value; break; case nameof(cmd.TargetPath): cmd.TargetPath = value; break; case nameof(cmd.AssemblyName): cmd.AssemblyName = value; break; case nameof(cmd.Compile): cmd.Compile.Add(value); break; case nameof(cmd.Reference): cmd.Reference.Add(value); break; case nameof(cmd.DefineConstants): cmd.DefineConstants.AddRange(value?.Split(',', StringSplitOptions.RemoveEmptyEntries)); break; default: throw new ArgumentOutOfRangeException($"Key \"{key}\" in argument file is unknown."); } } var stopwatch = Stopwatch.StartNew(); cmd.Execute(CancellationToken.None).GetAwaiter().GetResult(); cmd.Log.LogInformation($"Total code generation time: {stopwatch.ElapsedMilliseconds}ms."); } }