83 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
namespace gehGassi.Permissions
{
/// <summary>
/// Hilfsklasse zum Packen und entpacken der Permissions
/// </summary>
public static class PermissionPacker
{
public const char PackType = 'H';
public const int PackedSize = 4;
public static string FormDefaultPackPrefix()
{
return $"{PackType}{PackedSize:D1}-";
}
/// <summary>
/// Liste von Permissions in String packen
/// </summary>
/// <param name="permissions">Liste Permissions</param>
/// <returns>Rechte in String gepackt</returns>
public static string PackPermissionsIntoString(this IEnumerable<Permission> permissions)
{
return permissions.Aggregate(FormDefaultPackPrefix(), (s, permission) => s + ((int)permission).ToString("X4"));
}
/// <summary>
/// Entpacken der Permissions aus einem string in eine Liste von ints
/// </summary>
/// <param name="packedPermissions">Gepackte Liste mit Permissions</param>
/// <returns>Liste Permissions als int</returns>
[ExcludeFromCodeCoverage]
public static IEnumerable<int> 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;
}
}
/// <summary>
/// Liste von Permissions aus String entpacken
/// </summary>
/// <param name="packedPermissions">Gepackte Liste mit Permissions</param>
/// <returns>Liste Permissions</returns>
public static IEnumerable<Permission> UnpackPermissionsFromString(this string packedPermissions)
{
return packedPermissions.UnpackPermissionValuesFromString().Select(x => ((Permission)x));
}
/// <summary>
/// Sucht eine Permission im gepackten string
/// </summary>
/// <param name="permissionName">Name der gesuchten Permission</param>
/// <returns>Permission wenn gefunden, null sonst</returns>
public static Permission? FindPermissionViaName(this string permissionName)
{
return Enum.TryParse(permissionName, out Permission permission)
? (Permission?)permission
: null;
}
}
}