using System; using System.Collections.Generic; namespace Robust.Shared.Configuration; public static class ConfigurationManagerExtensions { /// /// Subscribe to multiple cvar in succession and dispose object to unsubscribe from all of them when needed. /// public static ConfigurationMultiSubscriptionBuilder SubscribeMultiple(this IConfigurationManager manager) { return new ConfigurationMultiSubscriptionBuilder(manager); } } /// /// Container for batch-unsubscription of config changed events. /// Call Dispose() when subscriptions are not needed anymore. /// public sealed class ConfigurationMultiSubscriptionBuilder(IConfigurationManager manager) : IDisposable { private readonly List _unsubscribeActions = []; /// > public ConfigurationMultiSubscriptionBuilder OnValueChanged( CVarDef cVar, CVarChanged onValueChanged, bool invokeImmediately = false ) where T : notnull { manager.OnValueChanged(cVar, onValueChanged, invokeImmediately); _unsubscribeActions.Add(() => manager.UnsubValueChanged(cVar, onValueChanged)); return this; } /// > public ConfigurationMultiSubscriptionBuilder OnValueChanged( string name, CVarChanged onValueChanged, bool invokeImmediately = false ) where T : notnull { manager.OnValueChanged(name, onValueChanged, invokeImmediately); _unsubscribeActions.Add(() => manager.UnsubValueChanged(name, onValueChanged)); return this; } /// > public ConfigurationMultiSubscriptionBuilder OnValueChanged( CVarDef cVar, Action onValueChanged, bool invokeImmediately = false ) where T : notnull { manager.OnValueChanged(cVar, onValueChanged, invokeImmediately); _unsubscribeActions.Add(() => manager.UnsubValueChanged(cVar, onValueChanged)); return this; } /// > public ConfigurationMultiSubscriptionBuilder OnValueChanged( string name, Action onValueChanged, bool invokeImmediately = false ) where T : notnull { manager.OnValueChanged(name, onValueChanged, invokeImmediately); _unsubscribeActions.Add(() => manager.UnsubValueChanged(name, onValueChanged)); return this; } /// public void Dispose() { foreach (var action in _unsubscribeActions) { action(); } _unsubscribeActions.Clear(); } }