#pragma warning disable SA1512,SA1124 // Single-line comments should not be followed by blank line
using System;
using JetBrains.Annotations;
using UnityEngine;
#region No ReShaper
// ReSharper disable All
// needed because 'JetBrains.Annotations.NotNull' and 'System.Diagnostics.CodeAnalysis.NotNull' collide if this file is compiled with a never version of Unity / C#
using SuppressMessageAttribute = System.Diagnostics.CodeAnalysis.SuppressMessageAttribute;
// ReSharper restore All
#endregion
#pragma warning restore SA1512,SA1124 // Single-line comments should not be followed by blank line
namespace NugetForUnity.Models
{
///
/// Wrapper to make a interfaced able to be serialized using Unity (Unity can only serialize concrete classes not
/// interfaces).
///
[Serializable]
internal sealed class SerializableNugetPackage
{
[CanBeNull]
[SerializeField]
private NugetPackageLocal packageLocal;
[SerializeField]
private PackageType packageType;
[CanBeNull]
[SerializeField]
private NugetPackageV2 packageV2;
[CanBeNull]
[SerializeField]
private NugetPackageV3 packageV3;
///
/// Initializes a new instance of the class.
///
/// The package.
public SerializableNugetPackage(INugetPackage packageInterface)
{
var type = packageInterface?.GetType() ?? throw new ArgumentNullException(nameof(packageInterface));
if (type == typeof(NugetPackageLocal))
{
packageLocal = (NugetPackageLocal)packageInterface;
packageType = PackageType.Local;
}
else if (type == typeof(NugetPackageV2))
{
packageV2 = (NugetPackageV2)packageInterface;
packageType = PackageType.V2;
}
else if (type == typeof(NugetPackageV3))
{
packageV3 = (NugetPackageV3)packageInterface;
packageType = PackageType.V3;
}
else
{
throw new ArgumentException($"Package has type: {type} with is currently not handled.", nameof(packageInterface));
}
}
///
/// Gets the package as general interface.
///
[NotNull]
public INugetPackage Interfaced
{
get
{
switch (packageType)
{
case PackageType.Local:
return packageLocal ?? throw new InvalidOperationException($"Package is null {packageType}");
case PackageType.V2:
return packageV2 ?? throw new InvalidOperationException($"Package is null {packageType}");
case PackageType.V3:
return packageV3 ?? throw new InvalidOperationException($"Package is null {packageType}");
default:
throw new InvalidOperationException($"Package has type: {packageType} with is currently not handled.");
}
}
}
[SuppressMessage(
"StyleCop.CSharp.OrderingRules",
"SA1201:Elements should appear in the correct order",
Justification = "We like private enums at the botom of the file.")]
private enum PackageType
{
Local,
V2,
V3,
}
}
}