static async Task Main()

in src/PortingAssistantExtensionServer/Program.cs [24:99]


        static async Task Main(string[] args)
        {
            try
            {
                if (args.Length < 1)
                {
                    throw new ArgumentException("Must provide a config file");
                }
                var config = args[0];
                var stdInPipeName = args.Length == 1 ? Common.Constants.stdDebugInPipeName : args[1];
                var stdOutPipeName = args.Length == 1 ? Common.Constants.stdDebugOutPipeName : args[2];
                Common.PALanguageServerConfiguration.ExtensionVersion = args.Length == 1 ? "0.0.0" : args[3];
                var vsClientVersion = args.Length == 1 ? Common.Constants.VS_UNKNOWN : args[4];
                Common.PALanguageServerConfiguration.VisualStudioVersion = GetVSVersion(vsClientVersion);
                Console.WriteLine($"Porting Assistant Version is {Common.PALanguageServerConfiguration.ExtensionVersion}");
                Console.WriteLine($"Visual Studio Version is {Common.PALanguageServerConfiguration.VisualStudioVersion}");
                var portingAssistantConfiguration = JsonSerializer.Deserialize<PortingAssistantIDEConfiguration>(File.ReadAllText(config));
                
                var outputTemplate = Common.Constants.DefaultOutputTemplate;
                var isConsole = args.Length == 5 && args[4].Equals("--console");
                if (args.Length == 5 && !args[4].Equals("--console"))
                {
                    outputTemplate = "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] (Porting Assistant IDE Extension) (" + args[3] + ") {SourceContext}: {Message:lj}{NewLine}{Exception}";
                }
                Serilog.Formatting.Display.MessageTemplateTextFormatter tf = new Serilog.Formatting.Display.MessageTemplateTextFormatter(outputTemplate, CultureInfo.InvariantCulture);
                var logConfiguration = new LoggerConfiguration().Enrich.FromLogContext()
                    .MinimumLevel.Warning()
                    .WriteTo.File(
                        portingAssistantConfiguration.TelemetryConfiguration.LogFilePath,
                        rollingInterval: RollingInterval.Day,
                        rollOnFileSizeLimit: true,
                        outputTemplate: outputTemplate);
                if (isConsole)
                {
                    logConfiguration = logConfiguration.WriteTo.Console();
                }
                Log.Logger = logConfiguration.CreateLogger();
                TelemetryCollector.Builder(Log.Logger, portingAssistantConfiguration.TelemetryConfiguration.MetricsFilePath);
                var (input, output) = await CreateNamedPipe(stdInPipeName, stdOutPipeName);
                var portingAssisstantLanguageServer = new PortingAssistantLanguageServer(
                    loggingBuilder => loggingBuilder
                    .SetMinimumLevel(LogLevel.Debug)
                    .AddLanguageProtocolLogging()
                    .AddSerilog(logger: Log.Logger, dispose: true),
                    input,
                    output,
                    portingAssistantConfiguration
                    );
                await portingAssisstantLanguageServer.StartAsync();

                var logTimer = new System.Timers.Timer();
                
                logTimer.Interval = Convert.ToDouble(portingAssistantConfiguration.TelemetryConfiguration.LogTimerInterval);
                var lastReadTokenFile = Path.Combine(portingAssistantConfiguration.TelemetryConfiguration.LogsPath, "lastToken.json");
                logTimer.Elapsed += (source, e) => LogUploadUtils.OnTimedEvent(source, e, portingAssistantConfiguration.TelemetryConfiguration, lastReadTokenFile, Common.PALanguageServerConfiguration.AWSProfileName); ;
                logTimer.AutoReset = true;
                logTimer.Enabled = true;
                
                await portingAssisstantLanguageServer.WaitForShutdownAsync();

                if (portingAssisstantLanguageServer.IsSeverStarted() && !_isConnected)
                {
                    await portingAssisstantLanguageServer.WaitForShutdownAsync();
                    Environment.Exit(0);
                }
            }
            catch (Exception ex)
            {
                Log.Logger.Error(ex, "Porting Assistant Extension failed with error: ");
                Environment.Exit(1);
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }