File: Agents\AspireSkills\AspireSkillsBundle.cs
Web Access
Project: src\src\Aspire.Cli\Aspire.Cli.csproj (aspire)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Globalization;
 
namespace Aspire.Cli.Agents.AspireSkills;
 
/// <summary>
/// A validated Aspire skills bundle.
/// </summary>
internal sealed class AspireSkillsBundle
{
    private readonly string _version;
    private readonly IReadOnlyList<ValidatedAspireSkill> _skills;
 
    internal AspireSkillsBundle(string version, IReadOnlyList<ValidatedAspireSkill> skills)
    {
        _version = version;
        _skills = skills;
    }
 
    /// <summary>
    /// Gets the bundle version.
    /// </summary>
    public string Version => _version;
 
    /// <summary>
    /// Gets installable files for the specified skill.
    /// </summary>
    public Task<IReadOnlyList<SkillAssetFile>> GetSkillFilesAsync(SkillDefinition skill, CancellationToken cancellationToken)
    {
        ArgumentNullException.ThrowIfNull(skill);
        cancellationToken.ThrowIfCancellationRequested();
 
        var bundledSkill = _skills.FirstOrDefault(s => string.Equals(s.Definition.Name, skill.Name, StringComparison.Ordinal));
        if (bundledSkill is null)
        {
            throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Aspire skills bundle does not contain skill '{0}'.", skill.Name));
        }
 
        List<SkillAssetFile> files = [];
        foreach (var bundledFile in bundledSkill.Files.OrderBy(f => f.RelativePath, StringComparer.Ordinal))
        {
            var relativePath = bundledFile.RelativePath;
            if (!skill.ShouldInstallFile(relativePath) ||
                !bundledSkill.Definition.ShouldInstallFile(relativePath))
            {
                continue;
            }
 
            files.Add(bundledFile);
        }
 
        return Task.FromResult<IReadOnlyList<SkillAssetFile>>(files);
    }
 
    /// <summary>
    /// Gets the installable skill definitions declared by the bundle manifest.
    /// </summary>
    public IReadOnlyList<SkillDefinition> GetSkillDefinitions()
    {
        return _skills
            .Select(static skill => skill.Definition)
            .ToList();
    }
}
 
internal sealed record ValidatedAspireSkill(
    SkillDefinition Definition,
    IReadOnlyList<SkillAssetFile> Files);