using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
namespace gehGassi.Permissions
{
///
/// Hilfsklasse zum Packen und entpacken der Permissions
///
public static class PermissionPacker
{
public const char PackType = 'H';
public const int PackedSize = 4;
public static string FormDefaultPackPrefix()
{
return $"{PackType}{PackedSize:D1}-";
}
///
/// Liste von Permissions in String packen
///
/// Liste Permissions
/// Rechte in String gepackt
public static string PackPermissionsIntoString(this IEnumerable permissions)
{
return permissions.Aggregate(FormDefaultPackPrefix(), (s, permission) => s + ((int)permission).ToString("X4"));
}
///
/// Entpacken der Permissions aus einem string in eine Liste von ints
///
/// Gepackte Liste mit Permissions
/// Liste Permissions als int
[ExcludeFromCodeCoverage]
public static IEnumerable UnpackPermissionValuesFromString(this string packedPermissions)
{
var packPrefix = FormDefaultPackPrefix();
if (packedPermissions == null)
{
throw new ArgumentNullException(nameof(packedPermissions));
}
if (!packedPermissions.StartsWith(packPrefix))
{
throw new InvalidOperationException("The format of the packed permissions is wrong" +
$" - should start with {packPrefix}");
}
int index = packPrefix.Length;
while (index < packedPermissions.Length)
{
yield return int.Parse(packedPermissions.Substring(index, PackedSize), NumberStyles.HexNumber);
index += PackedSize;
}
}
///
/// Liste von Permissions aus String entpacken
///
/// Gepackte Liste mit Permissions
/// Liste Permissions
public static IEnumerable UnpackPermissionsFromString(this string packedPermissions)
{
return packedPermissions.UnpackPermissionValuesFromString().Select(x => ((Permission)x));
}
///
/// Sucht eine Permission im gepackten string
///
/// Name der gesuchten Permission
/// Permission wenn gefunden, null sonst
public static Permission? FindPermissionViaName(this string permissionName)
{
return Enum.TryParse(permissionName, out Permission permission)
? (Permission?)permission
: null;
}
}
}