using System; using System.Collections; using System.Collections.Generic; namespace Unity.VisualScripting { [SerializationVersion("A")] public sealed class VariableDeclarations : IEnumerable, ISpecifiesCloner { public VariableDeclarations() { collection = new VariableDeclarationCollection(); } public VariableKind Kind; [Serialize, InspectorWide(true)] private VariableDeclarationCollection collection; internal Action OnVariableChanged; public object this[[InspectorVariableName(ActionDirection.Any)] string variable] { get => Get(variable); set => Set(variable, value); } public void Set([InspectorVariableName(ActionDirection.Set)] string variable, object value) { if (string.IsNullOrEmpty(variable)) { // Do nothing: safer for e.g. default event configurations, // where we don't specify a variable name. If we specified a default, // we might override a user value inadvertently. return; } if (collection.TryGetValue(variable, out var declaration)) { if (declaration.value != value) { declaration.value = value; OnVariableChanged?.Invoke(); } } else { collection.Add(new VariableDeclaration(variable, value)); OnVariableChanged?.Invoke(); } } public object Get([InspectorVariableName(ActionDirection.Get)] string variable) { if (string.IsNullOrEmpty(variable)) { throw new ArgumentException("No variable name specified.", nameof(variable)); } if (collection.TryGetValue(variable, out var declaration)) { return declaration.value; } throw new InvalidOperationException($"Variable not found: '{variable}'."); } public T Get([InspectorVariableName(ActionDirection.Get)] string variable) { return (T)Get(variable, typeof(T)); } public object Get([InspectorVariableName(ActionDirection.Get)] string variable, Type expectedType) { return ConversionUtility.Convert(Get(variable), expectedType); } public void Clear() { collection.Clear(); } public bool IsDefined([InspectorVariableName(ActionDirection.Any)] string variable) { if (string.IsNullOrEmpty(variable)) { throw new ArgumentException("No variable name specified.", nameof(variable)); } return collection.Contains(variable); } public VariableDeclaration GetDeclaration(string variable) { if (collection.TryGetValue(variable, out var declaration)) { return declaration; } throw new InvalidOperationException($"Variable not found: '{variable}'."); } public IEnumerator GetEnumerator() { return collection.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)collection).GetEnumerator(); } ICloner ISpecifiesCloner.cloner => VariableDeclarationsCloner.instance; } }