private string GetOutputPath(string outputExtension)
        {
            string outputPathDefault = Path.Combine(Directory.GetCurrentDirectory(), string.Format(Constants.DefaultOutputFileName, outputExtension));
            string outputPath        = this.argumentManager.GetArgumentValue(Constants.ConsoleArguments.OutputFileName, outputPathDefault);

            outputPath = ConsoleMergeManager.CleanAndValidateOutputPath(outputPath, outputExtension);

            return(outputPath);
        }
        /// <summary>
        /// Coordinates the merging of code files using information provided via the console.
        /// </summary>
        public async Task MergeAsync()
        {
            if (!this.args.Any() || this.argumentManager.IsArgumentPresent(Constants.ConsoleArguments.Help))
            {
                await Console.Error.WriteLineAsync(this.GetHelp());

                return;
            }

            string language = this.argumentManager.GetArgumentValue(Constants.ConsoleArguments.Language);

            if (language == null)
            {
                await Console.Error.WriteLineAsync($"[ERROR] Please provide the language type using {string.Join(",", Constants.ConsoleArguments.Language)}");

                await Console.Error.WriteLineAsync();

                await Console.Error.WriteLineAsync(this.GetHelp());

                return;
            }

            IFileMerger merger;

            try
            {
                merger = this.GetFileMerger(language);
            }
            catch (ArgumentException)
            {
                await Console.Error.WriteLineAsync($"[ERROR] Language type:({language}) is not supported.");

                return;
            }

            this.validExtensions = merger.ValidExtensions;

            if (this.argumentManager.IsArgumentPresent(Constants.ConsoleArguments.LanguageSpecificHelp))
            {
                await Console.Error.WriteLineAsync(merger.HelpText);

                return;
            }

            string directory = this.argumentManager.GetArgumentValue(Constants.ConsoleArguments.Directory);

            if (directory == null)
            {
                await Console.Error.WriteLineAsync($"[ERROR] Please provide the directory containing code files using {string.Join(",", Constants.ConsoleArguments.Directory)}");

                await Console.Error.WriteLineAsync();

                await Console.Error.WriteLineAsync(this.GetHelp());

                return;
            }

            this.UpdateIgnoredDirectories();

            await Console.Error.WriteLineAsync($"[INFO] Getting all {language} files in {directory}...");

            IEnumerable <string> files = await this.GetMergeFiles(directory);

            await Console.Error.WriteLineAsync($"[INFO] Done getting all {language} files. {files.Count()} files found.");

            merger.FilesToMerge = files;

            string outputPath = this.GetOutputPath(merger.OutputExtension);
            string mergeText  = await ConsoleMergeManager.GetMergedTextAsync(merger);

            await ConsoleMergeManager.WriteOutputToFileAsync(outputPath, mergeText);
        }