using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace OliverBooth.Common.Data.ValueConverters; internal sealed class PermissionListConverter : ValueConverter, string> { public PermissionListConverter() : this(';') { } public PermissionListConverter(char separator) : base(v => ToProvider(v, separator), s => FromProvider(s, separator)) { } private static IReadOnlyList FromProvider(string source, char separator = ';') { var permissions = new List(); foreach (string permission in source.Split(separator)) { string name = permission; var allowed = true; if (name.Length > 1 && name[0] == '-') { name = name[1..]; allowed = false; } permissions.Add(new Permission(name, allowed)); } return permissions.AsReadOnly(); } private static string ToProvider(IEnumerable permissions, char separator = ';') { return string.Join(separator, permissions.Select(p => $"{(p.IsAllowed ? "-" : "")}{p.Name}")); } }