public static async Task <string> Generate(DirectoryInfo directory, TextWriter writer, bool generateStatistics = false)
    {
        if (directory is null)
        {
            throw new ArgumentNullException(nameof(directory));
        }

        if (writer is null)
        {
            throw new ArgumentNullException(nameof(writer));
        }

        var aggregator = new StyleAggregator();

        await writer.WriteLineAsync($"Analyzing {directory}...").ConfigureAwait(false);

        foreach (var file in directory.EnumerateFiles("*.cs", SearchOption.AllDirectories))
        {
            await writer.WriteLineAsync($"\tAnalyzing {file.FullName}...").ConfigureAwait(false);

            var(unit, model) = StyleGenerator.GetCompilationInformation(file.FullName);
            aggregator       = aggregator.Update(new StyleAggregator().Add(unit, model));
        }

        if (generateStatistics)
        {
            using var statisticsWriter = File.CreateText("statistics.json");
            new JsonSerializer().Serialize(statisticsWriter, aggregator);
        }

        return(aggregator.GenerateConfiguration());
    }
    public static string GenerateFromDocument(FileInfo document, TextWriter writer, bool generateStatistics = false)
    {
        if (document is null)
        {
            throw new ArgumentNullException(nameof(document));
        }

        if (writer is null)
        {
            throw new ArgumentNullException(nameof(writer));
        }

        if (document.Extension.ToUpperInvariant() == ".CS")
        {
            writer.WriteLine($"Analyzing {document.FullName}...");
            var(unit, model) = StyleGenerator.GetCompilationInformation(document.FullName);
            var aggregator = new StyleAggregator().Add(unit, model);

            if (generateStatistics)
            {
                using var statisticsWriter = File.CreateText("statistics.json");
                new JsonSerializer().Serialize(statisticsWriter, aggregator);
            }

            return(aggregator.GenerateConfiguration());
        }

        return(string.Empty);
    }