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; } } }