src/extensions/template_extension/DevNewTemplateGroupList.cs (127 lines of code) (raw):
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
//
using System.Text.Json;
using System.Text;
namespace Azure.AI.Details.Common.CLI.Extensions.Templates
{
public class DevNewTemplateGroupList
{
public DevNewTemplateGroupList()
{
Groups = GetTemplateGroups();
}
public List<DevNewTemplateGroup> Groups { get; private set; }
public bool ApplyFilter(string? templateName, string? templateFilter, string? languageFilter)
{
var groups = GetFilteredGroups(templateName, templateFilter, languageFilter);
if (groups.Count == 0) return false;
Groups = groups;
return true;
}
private static List<DevNewTemplateGroup> GetTemplateGroups()
{
var root = FileHelpers.FileNameFromResourceName("templates") + "/";
var files = FileHelpers.FindFilesInTemplatePath("*", null).ToList();
var uniqueNames = files
.Select(x => x.Replace(root, string.Empty))
.Where(x => x.EndsWith("_.json"))
.Select(x => x.Split(new char[] { '\\', '/' }).FirstOrDefault())
.Where(x => x != null)
.Select(x => x!)
.Distinct()
.ToList();
uniqueNames.Sort();
var templates = new List<DevNewTemplateItem>();
foreach (var uniqueName in uniqueNames)
{
var parameters = GetParameters(uniqueName);
var longName = parameters["_LongName"];
var shortName = parameters["_ShortName"];
var language = parameters["_Language"];
templates.Add(new DevNewTemplateItem()
{
LongName = longName,
ShortName = shortName,
Language = language,
UniqueName = uniqueName,
Parameters = parameters
});
}
templates.Add(new DevNewTemplateItem()
{
LongName = "Environment Variables",
ShortName = ".env",
Language = string.Empty,
UniqueName = ".env"
});
var grouped = templates
.GroupBy(x => x.LongName)
.Select(x => new DevNewTemplateGroup()
{
LongName = x.Key,
ShortName = x.First().ShortName,
Items = x.ToList()
})
.OrderBy(x => x.ShortName)
.ToList();
return grouped;
}
private List<DevNewTemplateGroup> GetFilteredGroups(string? templateName, string? templateFilter, string? languageFilter)
{
if (string.IsNullOrEmpty(templateName) && string.IsNullOrEmpty(templateFilter) && string.IsNullOrEmpty(languageFilter)) return Groups;
var filtered = Groups
.Where(x => string.IsNullOrEmpty(templateName) || x.ShortName == templateName || x.LongName == templateName)
.Where(x => string.IsNullOrEmpty(templateFilter) || x.ShortName.Contains(templateFilter) || x.LongName.Contains(templateFilter))
.Where(x => string.IsNullOrEmpty(languageFilter) || x.Languages.Split(", ").Contains(languageFilter) || x.Languages == string.Empty)
.ToList();
if (filtered.Count > 0 && !string.IsNullOrEmpty(languageFilter))
{
var updated = new List<DevNewTemplateGroup>();
foreach (var item in filtered)
{
updated.Add(new DevNewTemplateGroup()
{
LongName = item.LongName,
ShortName = item.ShortName,
Items = item.Items.Where(x => x.Language == languageFilter).ToList()
});
}
return updated;
}
return filtered;
}
private static Dictionary<string, string> GetParameters(string templateName)
{
var parameters = new Dictionary<string, string>();
var files = FileHelpers.FindFilesInTemplatePath($"{templateName}/_.json", null).ToList();
if (files.Count() == 0) return parameters;
var jsonFile = files.FirstOrDefault();
if (jsonFile != null)
{
UpdateParameters(jsonFile, parameters);
}
return parameters;
}
private static Dictionary<string, string> UpdateParameters(List<string> files, Dictionary<string, string> parameters)
{
var jsonFile = files.Where(x => x.EndsWith("_.json")).FirstOrDefault();
if (jsonFile != null)
{
files.Remove(jsonFile);
UpdateParameters(jsonFile, parameters);
}
return parameters;
}
private static void UpdateParameters(string jsonFile, Dictionary<string, string> parameters)
{
var json = FileHelpers.ReadAllText(jsonFile, new UTF8Encoding(false));
foreach (var item in JsonDocument.Parse(json).RootElement.EnumerateObject())
{
var name = item.Name;
var value = parameters.ContainsKey(name)
? parameters[name]
: item.Value.ToString();
parameters[name] = value!;
}
}
}
}