// Copyright Keysight Technologies 2012-2019
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at http://mozilla.org/MPL/2.0/.
using System;
using System.Linq;
namespace OpenTap.Package
{
///
/// Uniquely identifies a package in the OpenTAP package system.
///
public interface IPackageIdentifier
{
///
/// The name of the package.
///
string Name { get; }
///
/// The Semantic Version compliant version of the package.
///
SemanticVersion Version { get; }
///
/// The CPU Architechture of the package.
///
CpuArchitecture Architecture { get; }
///
/// Comma seperated list of operating systems that this package can run on.
///
string OS { get; }
}
///
/// Extensions to IPackageIdentifier.
///
public static class IPackageIdentifierExtensions
{
private static string[] SplitOs(string os)
{
if (os == null) return Array.Empty();
return os.Split(',').Select(o => o.Trim()).Where(o => !string.IsNullOrWhiteSpace(o)).ToArray();
}
///
/// True if this package is compatible (can be installed on) the specified operating system and architecture
///
///
/// Specifies a CPU architecture. If unspecified, the current host architecture is used.
/// Specifies an operating system. If null, the current host operating system is used.
///
public static bool IsPlatformCompatible(this IPackageIdentifier pkg, CpuArchitecture selectedArch = CpuArchitecture.Unspecified, string selectedOS = null)
{
var cpu = selectedArch == CpuArchitecture.Unspecified ? ArchitectureHelper.GuessBaseArchitecture : selectedArch;
var os = selectedOS ?? OperatingSystem.Current.ToString();
if (ArchitectureHelper.CompatibleWith(cpu, pkg.Architecture) == false)
return false;
if (string.IsNullOrWhiteSpace(pkg.OS) || string.IsNullOrWhiteSpace(os))
return true;
var oses = SplitOs(os);
return oses.Any(o => IsOsCompatible(pkg, o));
}
internal static bool IsOsCompatible(this IPackageIdentifier pkg, string os)
{
var supported = SplitOs(pkg.OS);
return supported.Contains(os, StringComparer.OrdinalIgnoreCase);
}
}
}