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