File: Resources\SatelliteStringResourceSourceMetadata.cs
Web Access
Project: Microsoft.DotNet.Cli.CoreUtils.csproj (Microsoft.DotNet.Cli.CoreUtils)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace Microsoft.DotNet.Cli.Resources.Internal;

/// <summary>
///  Lazily computed assembly metadata used for satellite probing.
/// </summary>
internal sealed class SatelliteStringResourceSourceMetadata
{
    /// <summary>
    ///  Initializes the source metadata.
    /// </summary>
    /// <param name="resourceAssemblyIdentity">The resource-owning assembly identity, if available.</param>
    /// <param name="satelliteAssemblyFileName">The standard satellite assembly filename.</param>
    /// <param name="neutralCultureName">The declared neutral culture name.</param>
    /// <param name="satelliteContractVersion">The satellite contract version, if declared.</param>
    internal SatelliteStringResourceSourceMetadata(
        ManagedAssemblyIdentity? resourceAssemblyIdentity,
        string? satelliteAssemblyFileName,
        string? neutralCultureName,
        Version? satelliteContractVersion)
    {
        ResourceAssemblyIdentity = resourceAssemblyIdentity;
        SatelliteAssemblyFileName = satelliteAssemblyFileName;
        NeutralCultureName = neutralCultureName;
        SatelliteContractVersion = satelliteContractVersion;
    }

    /// <summary>
    ///  The resource-owning assembly identity, if available.
    /// </summary>
    internal ManagedAssemblyIdentity? ResourceAssemblyIdentity { get; }

    /// <summary>
    ///  The standard satellite assembly filename, if the source assembly has a name.
    /// </summary>
    internal string? SatelliteAssemblyFileName { get; }

    /// <summary>
    ///  The declared neutral culture name, if any.
    /// </summary>
    internal string? NeutralCultureName { get; }

    /// <summary>
    ///  The satellite contract version, if declared.
    /// </summary>
    internal Version? SatelliteContractVersion { get; }

    /// <summary>
    ///  Creates metadata for an external assembly family name while retaining the generated owner's
    ///  version, culture, public-key token, and resource attributes.
    /// </summary>
    /// <param name="simpleName">The external owner assembly simple name.</param>
    /// <returns>The aliased source metadata.</returns>
    internal SatelliteStringResourceSourceMetadata WithSimpleName(string simpleName)
    {
        ManagedAssemblyIdentity identity = ResourceAssemblyIdentity
            ?? throw new InvalidOperationException("The resource assembly identity is missing.");

        return new(
            identity.WithName(simpleName),
            $"{simpleName}.resources.dll",
            NeutralCultureName,
            SatelliteContractVersion);
    }
}