// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AWS.Deploy.Common.IO;
using AWS.Deploy.DocGenerator.Utilities;
using AWS.Deploy.ServerMode.Client;
namespace AWS.Deploy.DocGenerator.Generators
{
///
/// Creates documentation for the deployment settings file that can be used as part of a CI/CD pipeline.
///
public class DeploymentSettingsFileGenerator : IDocGenerator
{
private readonly IRestAPIClient _restAPIClient;
private readonly IFileManager _fileManager;
public DeploymentSettingsFileGenerator(IRestAPIClient restAPIClient, IFileManager fileManager)
{
_restAPIClient = restAPIClient;
_fileManager = fileManager;
}
///
/// Creates markdown files per recipe that lists all the option settings that can be used in the deployment settings file.
///
public async Task Generate()
{
var recipes = await _restAPIClient.ListAllRecipesAsync(null);
foreach (var recipeSummary in recipes.Recipes)
{
var stringBuilder = new StringBuilder();
stringBuilder.AppendLine($"**Recipe ID:** {recipeSummary.Id}");
stringBuilder.AppendLine();
stringBuilder.AppendLine($"**Recipe Description:** {recipeSummary.Description}");
stringBuilder.AppendLine();
stringBuilder.AppendLine("**Settings:**");
stringBuilder.AppendLine();
var optionSettings = await _restAPIClient.GetRecipeOptionSettingsAsync(recipeSummary.Id, null);
GenerateChildSettings(stringBuilder, 0, optionSettings);
var fullPath = DocGeneratorExtensions.DetermineDocsPath($"content/docs/cicd/recipes/{recipeSummary.Name}.md");
await _fileManager.WriteAllTextAsync(fullPath, stringBuilder.ToString());
}
}
private void GenerateChildSettings(StringBuilder stringBuilder, int level, ICollection settings)
{
var titlePadding = new string(' ', level * 4);
var detailsPadding = new string(' ', (level + 1) * 4);
foreach (var setting in settings)
{
stringBuilder.AppendLine($"{titlePadding}* **{setting.Name}**");
stringBuilder.AppendLine($"{detailsPadding}* ID: {setting.Id}");
stringBuilder.AppendLine($"{detailsPadding}* Description: {setting.Description}");
stringBuilder.AppendLine($"{detailsPadding}* Type: {setting.Type}");
if (setting.Settings.Any())
{
stringBuilder.AppendLine($"{detailsPadding}* Settings:");
GenerateChildSettings(stringBuilder, level + 2, setting.Settings);
}
}
}
}
}