93 lines
2.9 KiB
C#
93 lines
2.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace ShrinkModFramework
|
|
{
|
|
internal interface IShrinkOwnedRegistry
|
|
{
|
|
void RemoveOwnedEntries(string ownerModId);
|
|
}
|
|
|
|
public sealed class ShrinkModRegistry<T> : IShrinkOwnedRegistry
|
|
{
|
|
private readonly Dictionary<string, ShrinkRegistryEntry<T>> _entries = new();
|
|
|
|
public string Name { get; }
|
|
|
|
internal ShrinkModRegistry(string name)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(name))
|
|
throw new ArgumentException("注册表名称不能为空。", nameof(name));
|
|
|
|
Name = name.Trim();
|
|
}
|
|
|
|
public IReadOnlyCollection<ShrinkRegistryEntry<T>> Entries => _entries.Values.ToArray();
|
|
|
|
public void Register(string ownerModId, string key, T value)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(ownerModId))
|
|
throw new ArgumentException("归属模组 ID 不能为空。", nameof(ownerModId));
|
|
if (string.IsNullOrWhiteSpace(key))
|
|
throw new ArgumentException("注册键不能为空。", nameof(key));
|
|
|
|
key = key.Trim();
|
|
if (_entries.ContainsKey(key))
|
|
throw new InvalidOperationException($"注册表 '{Name}' 中已存在键 '{key}'。");
|
|
|
|
_entries.Add(key, new ShrinkRegistryEntry<T>(ownerModId.Trim(), key, value));
|
|
}
|
|
|
|
public bool Contains(string key) => !string.IsNullOrWhiteSpace(key) && _entries.ContainsKey(key.Trim());
|
|
|
|
public bool TryGet(string key, out T value)
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(key) && _entries.TryGetValue(key.Trim(), out var entry))
|
|
{
|
|
value = entry.Value;
|
|
return true;
|
|
}
|
|
|
|
value = default;
|
|
return false;
|
|
}
|
|
|
|
public bool TryGetEntry(string key, out ShrinkRegistryEntry<T> entry)
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(key))
|
|
return _entries.TryGetValue(key.Trim(), out entry);
|
|
|
|
entry = default;
|
|
return false;
|
|
}
|
|
|
|
void IShrinkOwnedRegistry.RemoveOwnedEntries(string ownerModId)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(ownerModId))
|
|
return;
|
|
|
|
var keys = _entries
|
|
.Where(pair => string.Equals(pair.Value.OwnerModId, ownerModId, StringComparison.Ordinal))
|
|
.Select(pair => pair.Key)
|
|
.ToArray();
|
|
foreach (var key in keys)
|
|
_entries.Remove(key);
|
|
}
|
|
}
|
|
|
|
public readonly struct ShrinkRegistryEntry<T>
|
|
{
|
|
public string OwnerModId { get; }
|
|
public string Key { get; }
|
|
public T Value { get; }
|
|
|
|
public ShrinkRegistryEntry(string ownerModId, string key, T value)
|
|
{
|
|
OwnerModId = ownerModId;
|
|
Key = key;
|
|
Value = value;
|
|
}
|
|
}
|
|
}
|