public class SampleRequestManager()

in Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/SampleRequests/SampleRequestManager.cs [11:142]


public class SampleRequestManager(string preferenceDirectory)
{
    public const string SavedRequestGroup = "Saved Requests";
    public const string SavedRequestDirectory = "SavedRequests";

    public IDictionary<string, IList<LambdaRequest>> GetSampleRequests()
    {
        var content = GetEmbeddedResource("manifest.xml");
        XDocument xmlDoc = XDocument.Parse(content);

        var query = from item in xmlDoc.Descendants("request")
            select new
            {
                Name = item.Element("name")!.Value,
                Filename = item.Element("filename")!.Value
            };

        var requests = from item in xmlDoc.Descendants("request")
            select new LambdaRequest
            {
                Group = item.Attribute("category")?.Value ?? string.Empty,
                Name = item.Element("name")?.Value ?? string.Empty,
                Filename = item.Element("filename")?.Value ?? string.Empty,
            };

        var hash = new Dictionary<string, IList<LambdaRequest>>();

        foreach (var request in requests)
        {
            IList<LambdaRequest>? r;
            if (!hash.TryGetValue(request.Group, out r))
            {
                r = new List<LambdaRequest>();
                hash[request.Group] = r;
            }

            r.Add(request);
        }

        var savedRequestDirectory = GetSavedRequestDirectory();
        if(Directory.Exists(savedRequestDirectory))
        {
            var savedRequestFiles = Directory.GetFiles(GetSavedRequestDirectory(), "*.json");
            if (savedRequestFiles.Length > 0)
            {
                var savedRequests = new List<LambdaRequest>();
                hash[SavedRequestGroup] = savedRequests;
                foreach (var file in savedRequestFiles)
                {
                    var r = new LambdaRequest
                    {
                        Filename = $"{SavedRequestDirectory}@{Path.GetFileName(file)}",
                        Group = SavedRequestGroup,
                        Name = Path.GetFileNameWithoutExtension(file)
                    };
                    savedRequests.Add(r);
                }
            }
        }

        foreach (var key in hash.Keys.ToList())
        {
            hash[key] = hash[key].OrderBy(x => x.Name).ToList();
        }

        return hash;
    }

    public static bool TryDetermineSampleRequestName(string value, out string? sampleName)
    {
        sampleName = null;
        if (value == null)
            return false;

        if (!value.StartsWith(SavedRequestDirectory))
            return false;

        // The minus 6 is for the "@" and the trailing ".json"
        sampleName = value.Substring(SavedRequestDirectory.Length + 1, value.Length - SavedRequestDirectory.Length - 6);
        return true;
    }

    public string GetRequest(string name)
    {
        if(name.StartsWith(SavedRequestDirectory + "@"))
        {
            name = name.Substring(name.IndexOf("@") + 1);
            var savedRequestDirectory = GetSavedRequestDirectory();
            var path = Path.Combine(savedRequestDirectory, name);
            return File.ReadAllText(path);
        }
        return GetEmbeddedResource(name);
    }

    public string SaveRequest(string name, string content)
    {
        var filename = $"{name}.json";

        var savedRequestDirectory = GetSavedRequestDirectory();
        if (!Directory.Exists(savedRequestDirectory))
            Directory.CreateDirectory(savedRequestDirectory);

        File.WriteAllText(Path.Combine(savedRequestDirectory, filename), content);
        return $"{SavedRequestDirectory}@{filename}";
    }

    public string GetSaveRequestRelativePath(string name)
    {
        var relativePath = $"{SavedRequestDirectory}{Path.DirectorySeparatorChar}{name}";
        if (!name.EndsWith(".json"))
            relativePath += ".json";

        return relativePath;
    }

    private string GetEmbeddedResource(string name)
    {
        using (var stream =
            typeof(SampleRequestManager).Assembly.GetManifestResourceStream(
                "Amazon.Lambda.TestTool.Resources.SampleRequests." + name))
        using(var reader = new StreamReader(stream!))
        {
            return reader.ReadToEnd();
        }
    }

    public string GetSavedRequestDirectory()
    {
        var path = Path.Combine(preferenceDirectory, SavedRequestDirectory);
        return path;
    }
}