using System.Linq.Expressions; namespace AIStudio.Settings; public sealed class SettingsLocker { private readonly Dictionary> lockedProperties = new(); /// /// Registers a property of a class to be locked by a specific configuration plugin ID. /// /// The property expression to lock. /// The ID of the configuration plugin that locks the property. /// The type of the class that contains the property. public void Register(Expression> propertyExpression, Guid configurationPluginId) { var memberExpression = propertyExpression.GetMemberExpression(); var className = typeof(T).Name; var propertyName = memberExpression.Member.Name; if (!this.lockedProperties.ContainsKey(className)) this.lockedProperties[className] = []; this.lockedProperties[className].TryAdd(propertyName, configurationPluginId); } /// /// Removes the lock for a property of a class. /// /// The property expression to remove the lock for. /// The type of the class that contains the property. public void Remove(Expression> propertyExpression) { var memberExpression = propertyExpression.GetMemberExpression(); var className = typeof(T).Name; var propertyName = memberExpression.Member.Name; if (this.lockedProperties.TryGetValue(className, out var props)) { if (props.Remove(propertyName)) { // If the property was removed, check if the class has no more locked properties: if (props.Count == 0) this.lockedProperties.Remove(className); } } } /// /// Gets the configuration plugin ID that locks a specific property of a class. /// /// /// /// public Guid GetConfigurationPluginId(Expression> propertyExpression) { var memberExpression = propertyExpression.GetMemberExpression(); var className = typeof(T).Name; var propertyName = memberExpression.Member.Name; if (this.lockedProperties.TryGetValue(className, out var props) && props.TryGetValue(propertyName, out var configurationPluginId)) return configurationPluginId; // No configuration plugin ID found for this property: return Guid.Empty; } public bool IsLocked(Expression> propertyExpression) { var memberExpression = propertyExpression.GetMemberExpression(); var className = typeof(T).Name; var propertyName = memberExpression.Member.Name; return this.lockedProperties.TryGetValue(className, out var props) && props.ContainsKey(propertyName); } }